Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
ketxu

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

Các bài được khuyến nghị

Thống nhất xoá tất cả những bài trung gian để bớt loãng (kể cả bài này). Bác PTB viết thay (acet-geom-midpoint), sau đó tôi đề nghị tổng quát là thay mid bằng 1 điểm xác định bởi k (nên mới có cái từ div), nên nếu nói thay hàm nào của acet thì chịu. Ket thấy nó cần đưa vào list thì đưa, còn vì lý do hàm này không thay hàm nào của acet cả nên không đưa vào cũng được.

Vì e chưa biết nên hỏi, và là hỏi thật, chứ bất kỳ hàm nào của người nào viết ra cũng đáng trân trọng và đều có ích cả, và việc lên list khi sửa bài của e cũng không thay đổi việc hàm nào đó nằm trong CSDL của web :D

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

(defun Cv-explode (ss / el kq qa en)

   (setq el (entlast) kq (ssadd))
   (setq qa (getvar 'QAFLAGS))
   (setvar 'QAFLAGS 1)
   (command "explode" ss "")
   (setvar 'QAFLAGS qa)
   (while (setq en (entnext el))
       (ssadd en kq)
       (setq el en)
   )
   kq
)

Code trên kết quả thì giống hàm acet-explode nhưng mà thấy dài nhèn nhèn. Bác nào sửa giúp cho gọn đẹp với.

P/S: Sao trong thẻ code lúc nào cũng có chữ bbc,,,, gì đó không biết.

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

(defun Cv-explode (ss / el kq qa en)

   (setq el (entlast) kq (ssadd))
   (setq qa (getvar 'QAFLAGS))
   (setvar 'QAFLAGS 1)
   (command "explode" ss "")
   (setvar 'QAFLAGS qa)
   (while (setq en (entnext el))
       (ssadd en kq)
       (setq el en)
   )
   kq
)

Code trên kết quả thì giống hàm acet-explode nhưng mà thấy dài nhèn nhèn. Bác nào sửa giúp cho gọn đẹp với.

P/S: Sao trong thẻ code lúc nào cũng có chữ bbc,,,, gì đó không biết.

 

Dài ngắn cũng không quan trọng lắm, nhưng có cách gì không sử dụng hàm (command...) không nhỉ? Dùng (vlax-invoke obj 'Explode) được không nhỉ?

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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 ^^

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

(defun Cv-explode (ss / el kq qa en)

   (setq el (entlast) kq (ssadd))
   (setq qa (getvar 'QAFLAGS))
   (setvar 'QAFLAGS 1)
   (command "explode" ss "")
   (setvar 'QAFLAGS qa)
   (while (setq en (entnext el))
       (ssadd en kq)
       (setq el en)
   )
   kq
)

Code trên kết quả thì giống hàm acet-explode nhưng mà thấy dài nhèn nhèn. Bác nào sửa giúp cho gọn đẹp với.

P/S: Sao trong thẻ code lúc nào cũng có chữ bbc,,,, gì đó không biết.

Hề hề hề,

Theo mình nghĩ thì có nên đổi tên hàm thành CV:ss-explode không nhể vì như vậy nó sẽ cùng nhóm với các lệnh xủ lý bộ chọn như CV:ss-to-list .....

@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ỉ.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

@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 ^^

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
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.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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)

  • Vote tăng 4

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

 

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

Chỉnh sửa theo phamthanhbinh
Sửa lại lisp theo sự góp ý của các bác Tue_NV và ĐoanVanHa
  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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 ^^

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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

Chỉnh sửa theo phamthanhbinh
Sửa lại lisp theo góp ý của bác ĐoanVanHa

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

(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!

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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))

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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

  • Vote tăng 2

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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)

... ^^

  • Vote tăng 2

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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)

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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.

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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?

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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ề

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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.

 

 

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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 ^^

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Ý, 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.com/forum/index.php?showtopic=14210&view=findpost&p=149078

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay
Đăng nhập để thực hiện theo  

×