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

Làm thế nào lập hàm có đối số thay đổi

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

Trong list có một số hàm có đối số thay đổi như hàm strcase chẳng hạn. VD (strcase "aA") -> "AA", còn (strcase "aA" T) -> "aa" mà các bạn đã biết. Nếu muốn lập một hàm tương tự

VD : (aaaa 1) -> 1, (aaaa 1 2) -> 2, (aaaa 1 2 T) ->0

thì làm thế nào. Bạn nào biết xin hướng dẫn. Cám ơn rất nhiều

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ạn có thể nói rõ hơn đưọc không, như thế mình không hiểu lắm

Ví dụ rõ hơn được không?

nếu autolisp không hỗ trợ lệnh này thì bạn có thể dùng các lệnh con (thao tác với chuỗi list của bạn) để tách list ra cho ra kết quả 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
Bạn có thể nói rõ hơn đưọc không, như thế mình không hiểu lắm

Ví dụ rõ hơn được không?

nếu autolisp không hỗ trợ lệnh này thì bạn có thể dùng các lệnh con (thao tác với chuỗi list của bạn) để tách list ra cho ra kết quả như ý

ý mình muốn lập nhiều hàm cùng tên nhưng có số đối số khác nhau như một số hàm do cad cung cấp : strcase, getstring, inters ...

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
Trong list có một số hàm có đối số thay đổi như hàm strcase chẳng hạn. VD (strcase "aA") -> "AA", còn (strcase "aA" T) -> "aa" mà các bạn đã biết. Nếu muốn lập một hàm tương tự

VD : (aaaa 1) -> 1, (aaaa 1 2) -> 2, (aaaa 1 2 T) ->0

thì làm thế nào. Bạn nào biết xin hướng dẫn. Cám ơn rất nhiều

Bạn dùng kiểu của đối số là LIST, sau đó phụ thuộc vào chiều dài của đối số(LIST) này lập các hàm thực thi tuơng ứng.

ví dụ : Hàm đổi chuỗi sang chữ in hoa, với các tùy chọn :

- ch/dài của đối số = 1 : đổi toàn bộ chuỗi sang chữ in hoa

- ch/dài của đối số = 2 : đổi 1 phần bên trái của chuỗi sang chữ in hoa

- ch/dài của đối số = 3 : đổi 1 phần bên phải chuỗi sang chữ in hoa

(defun c:doit (/ str)
(defun strcase_substr (list_var / id id1 id2 len_var str)
 (if (eq (type list_var) 'LIST)
   (progn
     (setq len_var (vl-list-length  list_var))      
     (cond
       ((= len_var 1);convert all to uppercase 
 (strcase (car list_var)) )

((= len_var 2);convert left to uppercase 
 (setq str (car list_var)
       id (cadr list_var))
 (strcase (substr str 1 id)) )

((= len_var 3);convert right to uppercase 
 (setq str (car list_var)
       id1 (cadr list_var)
       id2 (caddr list_var) )
 (strcase (substr str id1 id2)) )

(t nil )	
          ) )
   nil)   )

 (setq str "CadViet")
 (princ "\nOrigin :   ")
 (princ str)
 (princ "\nAll    :   ")
 (princ (strcase_substr (list str)))
 (princ "\nLeft   :   ")
 (princ (strcase_substr (list str 3)))
 (princ "\nRight  :   ")
 (princ (strcase_substr (list str 4 7)))
 (princ "\nNIL    :   ")
 (princ (strcase_substr str))
 (princ))

  • 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ạn dùng kiểu của đối số là LIST, sau đó phụ thuộc vào chiều dài của đối số(LIST) này lập các hàm thực thi tuơng ứng.

ví dụ : Hàm đổi chuỗi sang chữ in hoa, với các tùy chọn :

- ch/dài của đối số = 1 : đổi toàn bộ chuỗi sang chữ in hoa

- ch/dài của đối số = 2 : đổi 1 phần bên trái của chuỗi sang chữ in hoa

- ch/dài của đối số = 3 : đổi 1 phần bên phải chuỗi sang chữ in hoa

Cám ơn bạn. Mình thấy cad cung cấp một số hàm theo kiểu nạp chồng giống C++ nhưng kg biết cơ chế này có làm đc trong lisp kg. Nếu có thì mình có thể viết thêm một số hàm cùng tên khác đối số nhưng không can thiệp vào code của hàm đã 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

Trước đây em không nghĩ điều này là cần thiết cho lắm, nhưng hôm nay viết 1 cái hàm con mà tham số cho nó lên đến con số 8 thì mỗi lần dùng mới thấy oải. nhất là trong những trường hợp như thế này:

(tenhamcon A [b [C [D..]]]) - 1 tham số chỉ có ý nghĩa sử dụng khi 1 tham số khác có mặt. trong hàm trên thì các tham số B, C, D không nhất thiết phải có. D chỉ được dùng đến khi có C, C chỉ được dùng đến khi có B.

 

Mẹo của bách của bác Gia Bach rất hay, giải quyết được vấn đề nhưng nếu xét về mặt lập trình chỉ tương đối giống thôi. mỗi lần sử dụng lại phải thêm 1 hàm (list ...) vào. Có thể cách làm này không giống bản chất với cách mà các hàm Visual lisp được xây dựng.

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  

×