Đến nội dung


Hình ảnh
- - - - -

[Thảo luận] Viết lại các hàm Express


  • Please log in to reply
194 replies to this topic

#161 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 03 January 2012 - 10:41 PM

nhìn đẹp fết đấy ketxu ạ. giải pháp này khá là hay. nhanh, gon, và nhẹ :)
  • 0

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#162 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5678 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 03 January 2012 - 10:53 PM

Nếu bỏ cái phần làm gọn đi thì cũng chỉ có đến 3,4 dòng code, xài tạm cũng đỡ ^^
Srr vừa nãy em để K L luôn trong hàm con, phải sửa lại
Chẹp, vậy là cũng xơi được ôi ối ACET rồi hén. Đâu phải là topic vô bổ ^^
Tình hình nếu nhiều nhiều 1 chút nữa thì tổng hợp thành THư viện hàm được rồi ^^
  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#163 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 03 January 2012 - 11:36 PM

mình thấy như vậy là cũng gần là đủ các hàm hay dùng rồi. các hàm còn lại hoặc không có nhu cầu dùng hoặc đã có giải pháp thay thế bằng các hàm visual lisp cùng chức năng. thấy mọi người cũng không còn nhiều hứng thú với topic này, giờ có lẽ chỉ chờ xem bạn nào có yêu cầu thì viết. :)
  • 0

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#164 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 04 January 2012 - 01:00 AM

Ví dụ sử dụng :


(defun C:mine2 (/ K L)
(setq K 0 L 10000)
(while (< k 10000)
(CV:Ui-Progress K L "Vui l\U+00F2ng ch\U+1EDD trong l\U+00FAc CAD \U+0111ang c\U+00E0y ^^" "CAD c\U+00E0y xong r\U+1ED3i, gi\U+1EDD \U+0111\U+1EBFn b\U+1EA1n c\U+00E0y ^^")
(setq k (1+ k) )
)
(princ)
)

- Khi sử dụng hàm này, chương trình chạy xong sẽ có thông báo công việc đã hoàn thành, tỉ dụ như: "cad cày xong rồi, giờ đến lượt bạn cày"
OK, giờ muốn chương trình tự động tắt dòng thông báo trên, trả lại đất cho status bar khi bạn tiếp tục cày ta thêm code này ngay trước khi kết thúc chương trình - đặt trước hàm (princ):
....
(grread 1)(grread 1)(setvar "modemacro" ".")
(princ)); end

- Ketxu thử post cái hình nó chạy bên máy của bạn mình dòm thử fát. một số ký tự trong list như "\U+258B" "\U+258A" "\U+2589".. mình cũng không thể tìm thấy trong bảng mã unicode, bên máy mình đoạn này không thấy có tác dụng gì nên chưa rõ chức năng của nó.
(setq tmp1 (strcat tmp1 (nth (rem (fix (/ var (/ (/ Total 15.0) 8.0))) 8) (list "\U+258F" "\U+258E" "\U+258D" "\U+258C" "\U+258B" "\U+258A" "\U+2589" "\U+2588" ))))
  • 1

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#165 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5678 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 04 January 2012 - 08:39 AM

Như em đã ghi chú, đoạn đó nhằm chuyển giao giữa các ký tự, bác có thể bỏ đi (vì k thực sự cần), khi đó mỗi lần tăng % nó sẽ thêm 1 lần U+2588, nhìn k mượt như có thêm đoạn này. Code e chụp ảnh là có đoạn này.

Nhân tiện sau khi bác xơi xong hàm progress này có thể làm nốt đoạn ss Drag move k ^^ ACET cho phép xơi cả thằng thuộc layer đã khóa đó, k đơn giản đâu ^^
  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#166 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 14 January 2012 - 10:17 AM

ACET-LIST-REMOVE-DUPLICATES. nguyên bản thì cú pháp của nó được viết như sau: (ACET-LIST-REMOVE-DUPLICATES list flag)
trong đó thì tham số flag của nó là nil hoặc 0 hoặc 1 (nil và 0 là giống nhau)
- flag = 0 hoặc nil: hàmchâp nhận mọi định dạng của các phần tử trong list kiêm tra : real, integer, list, string, variable...
- flag = 1: nó chỉ chấp nhận list kiểm tra chứa các phần tử là real và integer. tuy nhiên khi kiểm tra với real nó trả về kết quả lung tung beng. không thể chấp nhận được.
vì thế mình bỏ cái tham số flag vô nghĩa kia đi.

(defun CV:list-remove-duplicates (lst / lst1)
(foreach x lst (if (not (member x lst1)) (setq lst1 (append lst1 (list x))))) lst1)

ps: à quên, hàm này loại bỏ sự trùng (bằng hoặc giống) nhau của các phần tử trong list

Tue_NV nghĩ chúng ta nên thêm vào tính năng : hàm này loại bỏ sự trùng (bằng hoặc giống hoặc gần bằng) nhau của các phần tử trong list (Nếu phần tử x duyệt trong Lst thuộc kiểu LIST).
Ví dụ :
(setq Lst '((1 2.99999999999) (1 3) 1 2 3 6 8 1))
-> ((1 3.0) (1 3) 1 2 3 6 8 1)
-> Hàm (CV:list-remove-duplicates lst) -> ((1 3.0) (1 3) 1 2 3 6 8 1)
Nhưng Kết quả mong muốn là thế này : ((1 3.0) 1 2 3 6 8 1)

Ví dụ như khi loại bỏ các toạ độ điểm trùng hoặc gần trùng (trong khoảng sai số) trong 1 List vậy.

PS: Tuần trước Tue_NV lại phát hiện ra rằng : CAD phiên bản đời cao không thể LOAD các hàm trong ARX của CAD đời thấp (CAD đời thấp có thể LOAD các hàm trong ARX của CAD đời cao) mà CAD lại thay đổi phiên bản liên tục nên đây cũng là 1 lý do rất thuyết phục để viết lại các hàm Express.
  • 0

#167 Detailing

Detailing

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 667 Bài viết
Điểm đánh giá: 278 (khá)

Đã gửi 14 January 2012 - 03:41 PM

Tuần trước Tue_NV lại phát hiện ra rằng : CAD phiên bản đời cao không thể LOAD các hàm trong ARX của CAD đời thấp (CAD đời thấp có thể LOAD các hàm trong ARX của CAD đời cao) mà CAD lại thay đổi phiên bản liên tục nên đây cũng là 1 lý do rất thuyết phục để viết lại các hàm Express.

Theo mình đây là kết luận rất .... khó hiểu :huh:
Nó giống như người ở quá khứ biết tất cả những gì sẽ diễn ra trong khi người hiện tại ko ai biết tí gì về quá khứ :D
Express Tools của CAD đời nào thì đời đó hiểu. Tuy nhiên mỗi version CAD AU ko thay đổi toàn bộ các thư viện mà chỉ một số thôi có thể là đổi tên, kế thừa lớp mới, ... Do đó một số hàm CAD đời cũ đọc dc và có hàm CAD đời mới đọc dc đời cũ.
Mời các bạn bổ sung thêm.
Thanks!
  • 0

Ideas don't matter, execution does!

1908412_308002392716743_8165279281236341


#168 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 14 January 2012 - 10:58 PM

Update Progress Status dạng đơn giản. Ở mức độ sử dụng thì e thấy tạm thời chỉ cần thế này thôi, không nhất thiết phải chia ra làm mấy hàm như ACET (do đó không dùng biến đếm Global mà sử dụng chung với biến tăng của vòng lặp)


;| Status Bar Progress
Show Percent in Status Bar
@Ketxu 03-01-12
Var : bien tang (nam trong ham loop)
Total : tong so lan lap (biet truoc)
InProMsg : Message luc dang chay
DoneMsg : Message luc chay xong
|;
(defun CV:Ui-Progress (var Total InProMsg DoneMsg / tmp)
(if (>= Var (1- Total))(grtext -1 DoneMsg)(grtext -1 InProMsg))
(setq tmp "")
(repeat (fix (* 15 (/ var Total 1.0)))
(setq tmp (strcat tmp "\U+2588"))
)
; Doan nay lam min
(setq tmp (strcat tmp
(nth (rem (fix (/ var (/ (/ Total 15.0) 8.0))) 8)
(list "\U+258F" "\U+258E" "\U+258D" "\U+258C" "\U+258B" "\U+258A" "\U+2589" "\U+2588" )
)
)
) ; Ket thuc
(grtext -2 (strcat tmp "..." (rtos (/ (* 100.0 Var) Total) 2 0) "%..." ))
)
Ví dụ sử dụng :

(defun C:mine2 (/ K L)
(setq K 0 L 10000)
(while (< k 10000)
(CV:Ui-Progress K L "Vui l\U+00F2ng ch\U+1EDD trong l\U+00FAc CAD \U+0111ang c\U+00E0y ^^" "CAD c\U+00E0y xong r\U+1ED3i, gi\U+1EDD \U+0111\U+1EBFn b\U+1EA1n c\U+00E0y ^^")
(setq k (1+ k) )
)
(princ)
)

Hình như cái này chỉ dùng được với repeat, không dùng được với foreach+while? Cái của Terry Miller (dialoge) hình như dùng được cả repeat/foreach/while?
  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#169 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5678 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 14 January 2012 - 11:26 PM

Bác quote lại ngay cái VD dùng while ^^

Ghi chú ở dòng đầu tiên :

Total : tong so lan lap (biet truoc)


Không biết trước thì sửa code cũng được, nhưng lúc đó không có cái gọi là %
  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#170 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 14 January 2012 - 11:37 PM

Bác quote lại ngay cái VD dùng while ^^

Ghi chú ở dòng đầu tiên :


Không biết trước thì sửa code cũng được, nhưng lúc đó không có cái gọi là %

Cái này đã post cho Ket rồi mà (#156), ở các ví dụ Demo1 và Demo3
http://www.cadviet.c...ic=59727&st=140
  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#171 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5678 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 15 January 2012 - 10:06 AM

Cái này đã post cho Ket rồi mà (#156), ở các ví dụ Demo1 và Demo3
http://www.cadviet.c...ic=59727&st=140

Bác k hiểu ý e rồi :) Ý e ở bài #169 là bác nói hàm k dùng được cho while, n quote ngay lại cái ví dụ e viết bằng while. Tất nhiên về bản chất vẫn là biết trước tổng số lần thao tác như e nói ở bài trước. Các chương trình Diệt virus cũng vậy, để biết được % thì nó phải xác định số file cần quét trước đã. Nếu không có total, thì cái gọi là % công việc chỉ là hú họa, không có nghĩa lý ước lượng cho người dùng. Lúc đó thì ta cứ bắt thanh progress chạy đến full rồi lại chạy lại thôi
  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#172 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 15 January 2012 - 11:09 AM

Bác k hiểu ý e rồi :) Ý e ở bài #169 là bác nói hàm k dùng được cho while, n quote ngay lại cái ví dụ e viết bằng while. Tất nhiên về bản chất vẫn là biết trước tổng số lần thao tác như e nói ở bài trước. Các chương trình Diệt virus cũng vậy, để biết được % thì nó phải xác định số file cần quét trước đã. Nếu không có total, thì cái gọi là % công việc chỉ là hú họa, không có nghĩa lý ước lượng cho người dùng. Lúc đó thì ta cứ bắt thanh progress chạy đến full rồi lại chạy lại thôi


Ví dụ của Ket chỉ nằm ở trong file ấy thôi, vì while trong ví dụ của Ket cũng như là repeat. Tôi thử áp dụng cho chương trình của tôi, dùng while không biết số vòng lặp, thấy nó chạy khớp, tưởng ngon ăn, hoá ra bây giờ test thêm mấy trường hợp nữa thì đúng là hú hoạ thiệt. Srr Ket!
  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#173 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 04 February 2012 - 08:51 PM

ACET-LIST-REMOVE-DUPLICATES. nguyên bản thì cú pháp của nó được viết như sau: (ACET-LIST-REMOVE-DUPLICATES list flag)
trong đó thì tham số flag của nó là nil hoặc 0 hoặc 1 (nil và 0 là giống nhau)
- flag = 0 hoặc nil: hàmchâp nhận mọi định dạng của các phần tử trong list kiêm tra : real, integer, list, string, variable...
- flag = 1: nó chỉ chấp nhận list kiểm tra chứa các phần tử là real và integer. tuy nhiên khi kiểm tra với real nó trả về kết quả lung tung beng. không thể chấp nhận được.
vì thế mình bỏ cái tham số flag vô nghĩa kia đi.

(defun CV:list-remove-duplicates (lst / lst1)
(foreach x lst (if (not (member x lst1)) (setq lst1 (append lst1 (list x))))) lst1)

ps: à quên, hàm này loại bỏ sự trùng (bằng hoặc giống) nhau của các phần tử trong list

Tue_NV nghĩ chúng ta nên thêm vào tính năng : hàm này loại bỏ sự trùng (bằng hoặc giống hoặc gần bằng) nhau của các phần tử trong list
.......

Hàm CV:list-remove-duplicates được viết lại : hàm này loại bỏ sự trùng (bằng hoặc giống hoặc gần bằng) nhau của các phần tử trong list

(defun CV:list-remove-duplicates (lst / lst1)
;;;writen by Tue_NV
(foreach x lst
(if (not (member x lst1)) (setq lst1 (append lst1 (list x))))
(Progn
(foreach y lst1
(if (equal y x 1.0e-8)
(setq lst1 (vl-remove y lst1))
)
)
(setq lst1 (append lst1 (list x)) )
)
)
lst1
)

  • 2

#174 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5678 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 04 February 2012 - 11:06 PM

E thấy cái này dùng đệ quy như cách của LM cũng hay


(defun CV:List-remove-duplicates(l fz)

(if l
(cons (car l)
(CV:List-remove-duplicates
(vl-remove-if '(lambda ( x ) (equal x (car l) fz)) (cdr l)) fz
)
)
)
)

  • 3

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#175 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 05 February 2012 - 02:34 PM

Tiếp tục mấy hàm sử lý list nhé. mình cũng hay fải sử dụng mấy hàm này.
(ACET-LIST-PUT-NTH val list nth) : dùng để thay thế 1 phần tử val cho phần tử thứ nth của list.
Cái này mình cũng chơi đệ quy luôn
(defun Cv:list-put-nth (val lst id)
(if (<= id 0)
(cons val (cdr lst))
(if lst (cons (car lst) (Cv:list-put-nth val (cdr lst) (1- id))))))

  • 1

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#176 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 05 February 2012 - 04:42 PM

LM cũng có 2 hàm tương tự, nhưng kết quả trả về có khác nhau.
1). Dùng đệ quy:

(defun Cv:list-put-nth (val lst id)
(if lst
(if (zerop id)
(cons a (cdr lst))
(cons (car lst)
(Cv:list-put-nth val (cdr lst) (1- id))))))
2). Không dùng đệ quy:

(defun Cv:list-put-nth (val lst id / i )
(setq i -1)
(mapcar '(lambda (x) (if (= (setq i (1+ i)) id) val x)) lst))
Tuy nhiên so sánh giữa 3 hàm: của Acet, của bác Thaistreetz và của LM thì có sự khác nhau như sau:
Trích dẫn:
1). Theo Acet:
(acet-list-put-nth 1 '(a b c d e) -1) => (1 B C D E nil)
(acet-list-put-nth 1 '(a b c d e) 5) => (A B C D E 1)
(acet-list-put-nth 1 '(a b c d e) 6) => (A B C D E nil 1)
2). Theo Thaistreetz:
(Cv:list-put-nth 1 '(a b c d e) -1) => (1 B C D E)
(Cv:list-put-nth 1 '(a b c d e) 5) => (A B C D E 1)
(Cv:list-put-nth 1 '(a b c d e) 6) => (A B C D E)
3). Theo LM:
(Cv:list-put-nth 1 '(a b c d e) -1) => (A B C D E)
(Cv:list-put-nth 1 '(a b c d e) 5) => (A B C D E)
(Cv:list-put-nth 1 '(a b c d e) 6) => (A B C D E)
Vậy, nên dùng cái nào thì tiện nhất nhỉ?
  • 2

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#177 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 05 February 2012 - 05:37 PM

Ẹc! giống nhau i chang, khác mỗi cái kiểm trả điều kiện đối số. Xét về sự giống nhau của kết quả thì của mình trả về giống acet hơn. tuy nhiên mấy trường hợp đặc biệt này chắc chả mấy khi đụng fải nên dùng thế nào cũng được, tùy nhu cầu sử dụng của mỗi người thôi.
Vẫn là ACET-LIST-PUT-NTH nhưng mạnh hơn nữa đây:
(defun Cv:list-put-nth (val lst lst-id)
(if (= (type lst-id) 'LIST)
(if (<= (car lst-id) 0)
(if (and (cdr lst-id)(=(type(car lst))'LIST))(cons (Cv:list-put-nth val (car lst) (cdr lst-id)) (cdr lst))(cons val (cdr lst)))
(if lst (cons (car lst) (Cv:list-put-nth val (cdr lst) (Cv:list-put-nth (1- (car lst-id)) lst-id 0)))))
(if (<= lst-id 0)(cons val (cdr lst)) (if lst (cons (car lst) (Cv:list-put-nth val (cdr lst) (1- lst-id) ))))))
Hàm này mình nâng cấp thêm chút nữa để có thể thay thế 1 phần tử thuộc 1 list nằm trong list...n lớp. với đối số lst-id có thể là list hoặc integer miêu tả địa chỉ của phần tử cần thay thế.
VD1: (Cv:list-put-nth 1 '(a b c d e) 1) => (a 1 c d e)
VD2: (Cv:list-put-nth 1 '(a '(1 2 3 '(x y z)) c d e) '(1 3 1)) => (a '(1 2 3 '(x 1 z)) c d e)
VD3: (Cv:list-put-nth 1 '(a '(1 2 3 '(x y z)) c d e) '(1 3)) => (a '(1 2 3 1) c d e)
  • 2

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#178 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5678 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 05 February 2012 - 05:44 PM

Theo e thì viết như ACET, có thêm flag
Phần tử đầu mang
flag T : Thêm phần tử nil cho đủ số lượng (cả trước và sau)
flag nil : K thêm phần tử
  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#179 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 05 February 2012 - 05:57 PM

mình nghĩ điều đó là không cần thiết, bởi như thế là chúng ta copy 1 cách cứng nhắc acet khi mà ta hầu như ko có xác suất sử dụng nó. trong khi đó các hàm con sử lý danh sách thì ưu tiên hàng đầu vẫn là tốc độ. cần tránh tối đa việc kiểm tra dữ liệu và lặp danh sách nhiều lần
  • 0

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#180 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 05 February 2012 - 06:19 PM

Tiếp theo là (ACET-LIST-REMOVE-NTH nth list) : Dùng để loại bỏ phần tử thứ nth ra khỏi list
Tương tự như trên, hàm này mình cũng post 2 hàm.
Hàm cơ bản dùng cho list chỉ có 1 lớp
(defun Cv:list-remove-nth (id lst)
(if (<= id 0) (cdr lst) (if lst (cons (car lst) (Cv:list-remove-nth (1- id) (cdr lst))))))
VD1: (Cv:list-remove-nth 1 '(1 2 3)) => (1 3)

Hàm mạnh hơn, dùng cho list nhiều lớp
(defun Cv:list-remove-nth (lst-id lst)
(if (= (type lst-id) 'LIST)
(if (<= (car lst-id) 0)(if (and(cdr lst-id)(= (type(car lst))'LIST)) (cons(Cv:list-remove-nth(cdr lst-id)(car lst))(cdr lst))(cdr lst))
(if lst (cons (car lst) (Cv:list-remove-nth (Cv:list-put-nth (1- (car lst-id)) lst-id 0) (cdr lst)))))
(if (<= lst-id 0) (cdr lst) (if lst (cons (car lst) (Cv:list-remove-nth (1- lst-id) (cdr lst)))))))
VD2:(Cv:list-remove-nth '(1 2 0) '(1 '(a b (x y)) 3)) => (1 '(a b (y)) 3)
VD3:(Cv:list-remove-nth 1 '(1 '(a b (x y)) 3)) => (1 3)
  • 1

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD