Đế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

#81 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 25 November 2011 - 03:21 PM

@ketxu: do đây là topic viết lại các hàm acet theo hướng tiện dụng và bổ sung hoàn thiện nên mình nghĩ nếu như ta có thể bổ sung thêm các lệnh mới mà hữu dụng cho bộ CV:...... set thì cũng là một điều nên bác ạ.

Việc đặt tên hàm nên thống nhất theo mẫu, tỷ như CV: là tiếp đầu bắt buộc, Sau đó là cụm đối tượng của hàm tỷ như ss, list, ent, block...... và cuối cùng là hương xử lý tỳ như explode, copy, .. hay to-.....
Hề hề hề, như vậy có nhẽ nó ra cái dáng Cadviet hơn bác hỉ.

Xanh : vâng, e hoàn toàn nhất trí mà. Viết lại mà còn hơn mới hay chứ ^^ => Khả năng sẽ đổi thành CV library function (dự án đã bỏ dở từ ngày trước)
Đỏ : chuẩn chỉ bác ^^
  • 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


#82 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 25 November 2011 - 03:52 PM

Hoàn toàn được chứ bác, hàm trả về list Vla-Object, và ngoài ra phải catch trường hợp Obj không có method Explode ^^

Hề hề hề,
Nhân tiện bác Ketxu cho hỏi vài vấn đề liên quan như sau:
1/- Phải chăng sau khi chuyển các đối tượng thành vla-object sẽ phải sử dụng hàm vlax-invoke-method để explode các đối tượng này???
2/- Các method được dùng cho cái hàm vlax-invoke-method này thì tham khảo ở đâu bác nhể??? Mình tìm trong Help của CAD thấy mông lung quá mà chả biết tìm chỗ nào nữa.
3/- Với các đối tượng không sử dụng được method explode (như line-vla-object) thì next luôn hay là có dòng thông báo dối tượng không explode được như của command trong CAD.
Hề hề hề, nếu được bác chỉ thì mình có thể mò thử thằng cu này một tí cho nó ..... Oai.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#83 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 25 November 2011 - 04:06 PM

Hề hề hề,
Nhân tiện bác Ketxu cho hỏi vài vấn đề liên quan như sau:
1/- Phải chăng sau khi chuyển các đối tượng thành vla-object sẽ phải sử dụng hàm vlax-invoke-method để explode các đối tượng này???
2/- Các method được dùng cho cái hàm vlax-invoke-method này thì tham khảo ở đâu bác nhể??? Mình tìm trong Help của CAD thấy mông lung quá mà chả biết tìm chỗ nào nữa.
3/- Với các đối tượng không sử dụng được method explode (như line-vla-object) thì next luôn hay là có dòng thông báo dối tượng không explode được như của command trong CAD.
Hề hề hề, nếu được bác chỉ thì mình có thể mò thử thằng cu này một tí cho nó ..... Oai.

1- Như bác biết, khi chuyển thành vla-object, ta dùng (vlax-dump-object vla-object T) để xem các thuộc tính + method riêng có thể sử dụng với đối tượng vla-object này.
Bên cạnh method có ghi số nguyên thể hiện số đối số method đó yêu cầu (không tính vla-object trong hàm là bắt buộc)
Ví dụ dump với 1 Block ta sẽ có

....
; Methods supported:
; ArrayPolar (3)
; ArrayRectangular (6)
; ConvertToAnonymousBlock ()
; ConvertToStaticBlock (1)
; Copy ()
; Delete ()
; Explode ()
; GetAttributes ()
; GetBoundingBox (2)
; GetConstantAttributes ()
; GetDynamicBlockProperties ()
; GetExtensionDictionary ()
; GetXData (3)
; Highlight (1)
; IntersectWith (2)
; Mirror (2)
; Mirror3D (3)
; Move (2)
; ResetBlock ()
; Rotate (2)
; Rotate3D (3)
; ScaleEntity (2)
; SetXData (2)
; TransformBy (1)
; Update ()

2- Các method có thể dùng ở dạng (vlax-invoke vla-obj Hàm_Method) hoặc (vla-TênMethod vla-obj đối_số).
Qua số đối số của method, nếu ít, ta có thể đoán ngay được nó cần gì.
+ Như ví dụ với method Explode, số đối số = 0, không kể vla-object bắt buộc => luận ra cách sử dụng :
(vla-explode vla-object) hoặc (vlax-invoke vla-object 'Explode)
+ Hay ví dụ với method Move : 2 đối số. Mà ta biết lệnh move thì phải có điểm gốc, điểm đến để tạo vecto move => luận ra 2 đối số là 2 3d-point => dùng (vla-move vla-obj p1 p2)
.......
Với các method chưa luận ra được thì bác vào Develop help của CAD, mục VBA, search tên method => nhận được các yêu cầu với đối số
3- Nếu không kiểm tra có hay không có method, lisp sẽ crash ngay tại đối tượng áp dụng sai method.

E nói thêm là thường ít khi mọi người dùng vlax-invoke, chỉ nên dùng khi cần thu về list giá trị (khác với vla, trả về 1 variant)
  • 4

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


#84 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 25 November 2011 - 08:42 PM


E nói thêm là thường ít khi mọi người dùng vlax-invoke, chỉ nên dùng khi cần thu về list giá trị (khác với vla, trả về 1 variant)

Hề hề hề,
Hay quá, trước giờ do dốt nên mình mới chỉ mon men cái thằng (vlax-dump-object vla-object ) chưa dám sờ mó tới cái đối số T của hàm.
Giờ mới biết nó lợi hại thiệt.
Cũng mới chỉ gặm nhấm tí (vlax-invoke vla-obj Hàm_Method) chứ chửa biết dùng cái thằng (vla-TênMethod vla-obj đối_số) và cũng chả biết sự khác nhau của hai thằng này.
Hề hề hề, sướng thiệt. vậy là có thể thêm tí đồ chơi để nghịch ngợm rùi.
Mình xin cám ơn bác ketxu bằng hai cái hàm CV:string-find và CV:string-multi-find có thể dùng để thay thế cho (acet-str-find) và (acet-str-M-find) mới thử xong. Nhờ các bác kiểm lại coi có dùng được không nhé. cái này là mình cũng nhón vụng của bác DoanVanHa một ít. Mong các bác chớ có mắng hè.


;;;; Ham tim chuoi con trong chuoi me va tra ve vi tri bat dau cua chuoi con dau tien
(defun CV:string-find (sym str / n k i ltt str1 )
(setq n (strlen str) k (strlen sym) i 1 ltt (list) )
(while (and (<= i (1+ (- n k))) (= (length ltt) 0))
(setq str1 (substr str i k) )
(if (= str1 sym)
(setq ltt (append ltt (list i)))
)
(setq i (1+ i))
)
(car ltt)
)

;;;;; Ham tim tat ca cac chuoi con trong chuoi me va tra ve danh sach vi tri bat dau cua cac chuoi con
(defun CV:string-multi-find (sym str / n k i ltt str1)
(setq n (strlen str) k (strlen sym) i 1 ltt (list) )
(while (<= i (1+ (- n k)))
(setq str1 (substr str i k) )
(if (= str1 sym)
(setq ltt (append ltt (list i)))
)
(setq i (1+ i))
)
ltt
)
Thực ra như các bác thấy là nó tuy hai nhưng chỉ có một lần viết thui. Trò láu cá vặt ấy mà, các bác chớ giận nha.

Có một vấn đề khi viết cái thằng CV:strng-find là mình muốn dừng vòng lặp While ngay lần đầu tiên khi hàm if thỏa điều kiện cho nó lẹ hơn mà loay hoay hoài chửa ra. Mình đã dùng thêm biến phụ để lấy giá trị của i lúc đó mà vẫn chửa được. Nó cứ trả về nil hoài các bác ạ.
Tức quá làm phát củ chuối như thế này lại ăn ngay. Mỗi tội chắc chắn bị lâu hơn do phải lặp hết cả chuỗi lại còn phải tạo list nữa. Đúng là củ chuối thiệt.
Mong các bác xem qua rồi gỡ dùm. Chứ không có cứ phải xơi cái củ này thì đau bụng lắm.
Hề hề hề....

Bài viết đã được chỉnh sửa nội dung bởi phamthanhbinh: 25 November 2011 - 09:45 PM
Sửa lại lisp theo sự góp ý của các bác Tue_NV và ĐoanVanHa

  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#85 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 25 November 2011 - 08:51 PM

Bác Bình check lại trường hợp chuỗi con gồm nhiều ký tự (Multi Find) xem, e thấy nó chỉ trả về được bé đầu th ^^
Bác có thể gộp 2 thằng này thành 1 hàm CV:String-Find (sym str isFull) , nếu isFull = T thì phun ra cả list, không thì lấy thằng đầu 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


#86 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 25 November 2011 - 08:58 PM

Bác Bình check lại trường hợp chuỗi con gồm nhiều ký tự (Multi Find) xem, e thấy nó chỉ trả về được bé đầu th ^^
Bác có thể gộp 2 thằng này thành 1 hàm CV:String-Find (sym str isFull) , nếu isFull = T thì phun ra cả list, không thì lấy thằng đầu thôi ^^

Hơ hơ hơ,
Sao vầy cà, mình thấy nó trả về list ngon như acet mà.....
Bác coi đây nè:



Command: (cv:string-multi-find "an" "PHAM Thanh Binh dang an com")
(8 18 22)

Cái vụ ghép mình chử nghĩ tới. khéo mà hay hơn thiệt đó chớ bộ. Để ngẫm coi.
Hề hề hề,

Có phải ý bác như vầy không:


(defun CV:string-findall (sym str isFull / n k i ltt str1)
(setq n (strlen str) k (strlen sym) i 1 ltt (list) )
(while (<= i (1+ (- n k)))
(setq str1 (substr str i k) )
(if (= str1 sym)
(setq ltt (append ltt (list i)))
)
(setq i (1+ i))
)
(if isFull
ltt
(car ltt)
)
)
Nếu muốn kiếm cả thì nhập isFull là giá trị T, nếu muốn kiếm thằng đầu tiên thì nhập isFull là nil chứ đừng bỏ trống. Đây là kết quả mình test.


Command: (cv:string-findall "a" "PHAM Thanh Binh dang an com" T)
(8 18 22)

Command: (cv:string-findall "a" "PHAM Thanh Binh dang an com" )
; error: too few arguments

Command: (cv:string-findall "a" "PHAM Thanh Binh dang an com" nil)
8

Bài viết đã được chỉnh sửa nội dung bởi phamthanhbinh: 25 November 2011 - 09:56 PM
Sửa lại lisp theo góp ý của bác ĐoanVanHa

  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#87 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 25 November 2011 - 09:00 PM

(defun CV:string-find (sym str / n k i ltt str1 )
(defun CV:string-multi-find (sym str / n k i ltt str1)
Có một vấn đề khi viết cái thằng CV:strng-find là mình muốn dừng vòng lặp While ngay lần đầu tiên khi hàm if thỏa điều kiện cho nó lẹ hơn mà loay hoay hoài chửa ra. Mình đã dùng thêm biến phụ để lấy giá trị của i lúc đó mà vẫn chửa được. Nó cứ trả về nil hoài các bác ạ.
Tức quá làm phát củ chuối như thế này lại ăn ngay. Mỗi tội chắc chắn bị lâu hơn do phải lặp hết cả chuỗi lại còn phải tạo list nữa. Đúng là củ chuối thiệt.
Mong các bác xem qua rồi gỡ dùm. Chứ không có cứ phải xơi cái củ này thì đau bụng lắm.
Hề hề hề....


1). Nếu bác thấy while mà bắt lặp hết thì chuyển qua repeat, chắc sẽ nhanh hơn.
2). Chuyện nhỏ thôi: bác thêm giùm cho 2 thằng biến cục bộ là str1 và m nữa đi bác (thậm chí bỏ luôn setq m), vì đây là các hàm cơ bản, nên cần phải hoành tráng thế.
Thân thương!
  • 1

* 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.


#88 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 25 November 2011 - 09:18 PM

Mình xin cám ơn bác ketxu bằng hai cái hàm CV:string-find và CV:string-multi-find có thể dùng để thay thế cho (acet-str-find) và (acet-str-M-find) mới thử xong. Nhờ các bác kiểm lại coi có dùng được không nhé. cái này là mình cũng nhón vụng của bác DoanVanHa một ít. Mong các bác chớ có mắng hè.


;;;; Ham tim chuoi con trong chuoi me va tra ve vi tri bat dau cua chuoi con dau tien
(defun CV:string-find (sym str / n k i ltt str1 )
(setq n (strlen str) k (strlen sym) i 1 ltt (list) )
(while (<= i (1+ (- n k)))
(setq str1 (substr str i k) )
(if (= str1 sym)
(setq ltt (append ltt (list i)))
)
(setq i (1+ i))
)
(setq m (car ltt))
)
Thực ra như các bác thấy là nó tuy hai nhưng chỉ có một lần viết thui. Trò láu cá vặt ấy mà, các bác chớ giận nha.

Có một vấn đề khi viết cái thằng CV:strng-find là mình muốn dừng vòng lặp While ngay lần đầu tiên khi hàm if thỏa điều kiện cho nó lẹ hơn mà loay hoay hoài chửa ra. Mình đã dùng thêm biến phụ để lấy giá trị của i lúc đó mà vẫn chửa được. Nó cứ trả về nil hoài các bác ạ.
Tức quá làm phát củ chuối như thế này lại ăn ngay. Mỗi tội chắc chắn bị lâu hơn do phải lặp hết cả chuỗi lại còn phải tạo list nữa. Đúng là củ chuối thiệt.
Mong các bác xem qua rồi gỡ dùm. Chứ không có cứ phải xơi cái củ này thì đau bụng lắm.
Hề hề hề....

Chào bác Bình
Bác có thể điều kiện logic trong hàm while
Thay dòng : (<= i (1+ (- n k)))
Thành dòng : (and (<= i (1+ (- n k))) (= (length ltt) 0))
  • 1

#89 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 25 November 2011 - 09:39 PM

Chào bác Bình
Bác có thể điều kiện logic trong hàm while
Thay dòng : (<= i (1+ (- n k)))
Thành dòng : (and (<= i (1+ (- n k))) (= (length ltt) 0))

Hề hề hề,
Xin cám ơn sự chỉ bảo của các bác ĐoanVan ha và Tue_NV và cho phép mình sửa luôn vào các bài post trước cho đỡ tốn đất các bác nhé.
Hề hề hề.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#90 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 25 November 2011 - 09:50 PM

Hề hề hề,
Xin cám ơn sự chỉ bảo của các bác ĐoanVan ha và Tue_NV và cho phép mình sửa luôn vào các bài post trước cho đỡ tốn đất các bác nhé.
Hề hề hề.

Tue_NV cũng viết 1 hàm y như bác Bình, nhưng gọn hơn :

(defun CV:string-find (sym str / lst i)
(setq i 0)
(while (setq i (vl-string-search sym str i))
(setq lst (append lst (list i)) i (+ i 1))
)
lst)
Em thấy để lấy phần tử đầu thì dùng hàm (Car (CV:string-find sym str))
Lấy toàn bộ thì (CV:string-find sym str)
Như vậy là đủ rồi bác, không nhất thiết phải thêm ....isfull
  • 2

#91 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 25 November 2011 - 10:49 PM

Em thấy để lấy phần tử đầu thì dùng hàm (Car (CV:string-find sym str))
Lấy toàn bộ thì (CV:string-find sym str)
Như vậy là đủ rồi bác, không nhất thiết phải thêm ....isfull

Do (car nil) = nil + số lượng từ trong string không thể làm khó với vòng lặp while được, nên có lẽ ta có thể bỏ isFull như bác Tuệ góp ý. Coi như bác Bình viết cho mát tay, hí hí ^^ Srr bác vì góp ý chưa chuẩn, nên e đền lại bác đây :

(defun CV:String-Find (sym str ignoreCase / pos lst)
(if ignoreCase (setq str (strcase str) sym (strcase sym)))
(setq len (strlen sym) pos (- len))
(reverse
(while (setq pos (vl-string-search sym str (+ pos len)))
(setq lst (cons (1+ pos) lst))
)
)
)
- Bổ sung chế độ bỏ / k bỏ Case cho giống ACET
- Hạn chế bước nhảy (trong code, bác Bình nhảy 1+, nếu thay bằng 1+ strlen của sym thì hay hơn)
- Fix khi tìm "aa" trong "aaaaaaa"
- STT bắt đầu string là 1 cho giống ACET và substr (Bác Tuệ bắt đầu = 0)
... ^^
  • 2

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


#92 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 26 November 2011 - 07:19 AM

Do (car nil) = nil + số lượng từ trong string không thể làm khó với vòng lặp while được, nên có lẽ ta có thể bỏ isFull như bác Tuệ góp ý. Coi như bác Bình viết cho mát tay, hí hí ^^ Srr bác vì góp ý chưa chuẩn, nên e đền lại bác đây :


(defun CV:String-Find (sym str ignoreCase / pos lst)
(if ignoreCase (setq str (strcase str) sym (strcase sym)))
(setq len (strlen sym) pos (- len))
(reverse
(while (setq pos (vl-string-search sym str (+ pos len)))
(setq lst (cons (1+ pos) lst))
)
)
)
- Bổ sung chế độ bỏ / k bỏ Case cho giống ACET
- Hạn chế bước nhảy (trong code, bác Bình nhảy 1+, nếu thay bằng 1+ strlen của sym thì hay hơn)
- Fix khi tìm "aa" trong "aaaaaaa"
- STT bắt đầu string là 1 cho giống ACET và substr (Bác Tuệ bắt đầu = 0)
... ^^

Khi mình viết thường khong thay đổi cấu trúc của biến sym và str. Ketxu viết vầy thì khi ignoreCase = T thì có thể đã làm thay đổi biến Sym và str rồi đấy
Mình nghĩ chỉ cần CV:String-Find (sym str) là đủ rồi
- Lấy phần tử đầu thì dùng hàm (Car (CV:string-find sym str))
- Lấy toàn bộ thì (CV:string-find sym str)
- Phân biệt CASE như ketxu thì (CV:string-find (strcase sym) (strcase str) )
Nếu STT bắt đầu là 1 thì mình chỉ đổi vị trí setq trong code 1 chút là được

(defun CV:string-find (sym str / lst i)
(setq i 0)
(while (setq i (vl-string-search sym str i))
(setq i (+ i 1) lst (append lst (list i)) )
)
lst)

  • 1

#93 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 26 November 2011 - 07:21 AM

Do (car nil) = nil + số lượng từ trong string không thể làm khó với vòng lặp while được, nên có lẽ ta có thể bỏ isFull như bác Tuệ góp ý. Coi như bác Bình viết cho mát tay, hí hí ^^ Srr bác vì góp ý chưa chuẩn, nên e đền lại bác đây :


(defun CV:String-Find (sym str ignoreCase / pos lst)
(if ignoreCase (setq str (strcase str) sym (strcase sym)))
(setq len (strlen sym) pos (- len))
(reverse
(while (setq pos (vl-string-search sym str (+ pos len)))
(setq lst (cons (1+ pos) lst))
)
)
)
- Bổ sung chế độ bỏ / k bỏ Case cho giống ACET
- Hạn chế bước nhảy (trong code, bác Bình nhảy 1+, nếu thay bằng 1+ strlen của sym thì hay hơn)
- Fix khi tìm "aa" trong "aaaaaaa"
- STT bắt đầu string là 1 cho giống ACET và substr (Bác Tuệ bắt đầu = 0)
... ^^

Hề hề hề,
Bác ketxu xem lại chớ mình thấy với bước nhảy là strlen của sym , e rằng sẽ có lúc bỏ sót sym trong chuỗi str đó. Nhất là trong trường hợp (strlen sym) >1 bác ạ. Theo mình thì bước nhảy là 1 sẽ chuẩn hơn cho mọi trường hợp.
Hề hề hề.
@ bác Tue_NV: Ý kiến của bác hoàn toàn đúng, nhưng cần phải có chú thích để người dùng biết, vì khi sử dụng người dùng ít khi chú ý tới cái hàm (car (cv:string-find sym str)) mà thường sẽ chỉ nhớ (CV:string-find sym str) bác ạ. Vả lại như mình đã nói phía trên, nếu dùng kiểu (car (CV:string-find sym str)) thì vô hình chung ta sẽ phải chấp nhận cái củ chuối là khi chgi3 cần tìm thằng đầu tiên vẫn cứ phải lặp hết chuỗi str. Theo chỉ dẫn của bác mình đã bổ sung để hàm (CV:string-find sym str) sẽ dừng lặp khi tìm thấy chuỗi sym đầu tiên rồi.
  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#94 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 26 November 2011 - 08:16 AM

Hề hề hề,
Bác ketxu xem lại chớ mình thấy với bước nhảy là strlen của sym , e rằng sẽ có lúc bỏ sót sym trong chuỗi str đó. Nhất là trong trường hợp (strlen sym) >1 bác ạ. Theo mình thì bước nhảy là 1 sẽ chuẩn hơn cho mọi trường hợp.
Hề hề hề.
@ bác Tue_NV: Ý kiến của bác hoàn toàn đúng, nhưng cần phải có chú thích để người dùng biết, vì khi sử dụng người dùng ít khi chú ý tới cái hàm (car (cv:string-find sym str)) mà thường sẽ chỉ nhớ (CV:string-find sym str) bác ạ. Vả lại như mình đã nói phía trên, nếu dùng kiểu (car (CV:string-find sym str)) thì vô hình chung ta sẽ phải chấp nhận cái củ chuối là khi chgi3 cần tìm thằng đầu tiên vẫn cứ phải lặp hết chuỗi str. Theo chỉ dẫn của bác mình đã bổ sung để hàm (CV:string-find sym str) sẽ dừng lặp khi tìm thấy chuỗi sym đầu tiên rồi.

Tìm vị trí chuỗi sym đầu tiên bác có thể dùng :
(1+ (vl-string-search sym str 0))
nếu như bác không thích lặp while (không lặp chi cả) và cú pháp của nó cũng đơn giản, phải không bác?
  • 1

#95 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 26 November 2011 - 08:27 AM

Chào buổi sáng các bác ^^

Khi mình viết thường khong thay đổi cấu trúc của biến sym và str. Ketxu viết vầy thì khi ignoreCase = T thì có thể đã làm thay đổi biến Sym và str rồi đấy

=> Bác Tuệ nhầm rồi nè. Đối số của hàm con không hề làm ảnh hưởng tới biến của hàm main đâu

Hề hề hề,
Bác ketxu xem lại chớ mình thấy với bước nhảy là strlen của sym , e rằng sẽ có lúc bỏ sót sym trong chuỗi str đó. Nhất là trong trường hợp (strlen sym) >1 bác ạ. Theo mình thì bước nhảy là 1 sẽ chuẩn hơn cho mọi trường hợp.
Hề hề hề.

Hề hề, khó có đó bác ơi ^^
Bước nhảy phụ thuộc kết quả bác muốn trả về.
Bác kiểm chứng code bước nhảy 1 với việc tìm chuỗi "aa" trong "aaaaaa"

P/s : giờ thì e đã hiểu ý bác Bình, srr bác vì e hiểu nhầm ^^ E nói giảm bước nhảy như trong code của e + bác Tuệ, còn ở code của bác Bình thì bác đã chọn cách đi từng ký tự 1 rồi ^^

Tìm vị trí chuỗi sym đầu tiên bác có thể dùng :
(1+ (vl-string-search sym str 0))
nếu như bác không thích lặp while (không lặp chi cả) và cú pháp của nó cũng đơn giản, phải không bác?

1+ nil = crash
  • 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


#96 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 26 November 2011 - 08:54 AM

Chào buổi sáng các bác ^^

=> Bác Tuệ nhầm rồi nè. Đối số của hàm con không hề làm ảnh hưởng tới biến của hàm main đâu

1+ nil = crash

Cảm ơn Ketxu! Cái này mình nhầm thiệt. Hì hì
Còn 1 + nil = crash thì ta có thể cho thêm 1 hàm If nữa, không cần lặp While như bác Bình.
Giả sử cái chuổi sym của bác Bình nằm ở cuối chuỗi STR thì như bác Bình phải lặp qua toàn bộ kí tự STRing luôn. Theo Bác Bình thì gọi là ... củ chuối . Hề hề
  • 0

#97 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 26 November 2011 - 09:00 AM

Chào buổi sáng các bác ^^

=> Bác Tuệ nhầm rồi nè. Đối số của hàm con không hề làm ảnh hưởng tới biến của hàm main đâu

Hề hề, khó có đó bác ơi ^^
Bước nhảy phụ thuộc kết quả bác muốn trả về.
Bác kiểm chứng code bước nhảy 1 với việc tìm chuỗi "aa" trong "aaaaaa"


1+ nil = crash

Hề hề hề,
Trứng đây ạ:

Command: (cv:string-findall "aa" "aaaaaa" T)
(1 2 3 4 5)

Chứng tỏ rằng chuỗi "aaaaaa" này có tới 5 chuỗi con aa bác ạ.
Điều này là hoàn toàn đúng chớ đâu có sai.
Tuy nhiên nếu so với kết quả của hàm (acet-str-m-find "aa" "aaaaaa") thì quả có trật chìa.
Điều này có lẽ do mình hiểu sai cái định nghĩa của hàm (acet-str-m-find .....) mất rồi.


  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#98 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 26 November 2011 - 09:30 AM

E thì nghĩ nếu nó đã tính là 1 cụm và được đếm rồi thì thôi, ta loại bỏ nó khỏi chuỗi gốc, còn bác tính đuôi của thằng trước vẫn có thể làm đầu thằng sau. Cái này k phải đúng hay sai, mà chỉ là cách mình định nghĩa th ^^
  • 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


#99 Thaistreetz

Thaistreetz

    biết lệnh adcenter

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

Đã gửi 26 November 2011 - 03:54 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
  • 1

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


#100 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 26 November 2011 - 04:35 PM

Ý, theo e bác có thể bỏ dòng setq nil ở đầu tiên đi và thay member bằng vl-position ^^
Có 1 hàm tương tự ở mục Hỏi về lisp e gửi bằng đệ quy , k biết có nên dùng k :(
http://www.cadviet.c...ndpost&p=149078
  • 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