Chuyển đến nội dung
Diễn đàn CADViet
Jin Yong

Hỏi về Lisp (thuật toán, ý tưởng, coding,...)

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

22 phút trước, thanhduan2407 đã nói:

Dạ. Cháu cảm ơn bác. Cháu hiểu cách ấy rồi.

Hoặc:

(defun Ham1()

...

(cond ((= a "X") (Ham1))...

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
1 giờ} trướ}c, Doan Van Ha đã nói:

choose ?

Vì bác ấy ghi 

(setq choose ham1)...

ví dụ:

(setq  ch +)

(ch 5 3) = 8

Ch lúc đó là hàm +

 

Trong lisp thì hàm cũng là biến.

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
2 giờ trước, ngokiet đã nói:

Vì bác ấy ghi 

(setq choose ham1)...

ví dụ:

(setq  ch +)

(ch 5 3) = 8

Ch lúc đó là hàm +

 

Trong lisp thì hàm cũng là biến.

Sorry bác, trong hàm có biến đi kèm, mà biến chưa xác đị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
3 phút trước, thanhduan2407 đã nói:

Sorry bác, trong hàm có biến đi kèm, mà biến chưa xác định.

Thì vậy mình mới nói . Lúc nào xác định biến thì gọi hàm choose là đượ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

Có vẻ như động tác của NgoKiet là không cần thiết lắm, bởi gọi (ch 2 3) cũng như gọi (+ 2 3), vậy thì chỉ mất công (setq ch +) mà thôi.

99% là Duan đã nhầm chứ không có ý làm rắc rối thêm vấn đề.

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ắc là bạn ấy nhầm. 

Còn mình viết ví dụ thôi. Nếu chưa biết hàm nào dùng thì có thể set biến là hàm để sử dụng sau. Vì ban đầu bạn ấy viêt cũng ko có gì sai.

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áu cảm ơn bác @Doan Van Ha! và bác @ngokiet!

(cond
	     ((= Style "TDTP")
	      (setq LtsZichZac (SortPoint_TDTP LtsPoint kccum))
	     )
	     ((= Style "DTTP")
	      (setq LtsZichZac (SortPoint_DTTP LtsPoint kccum))
	     )
	     ((= Style "TPDT")
	      (setq LtsZichZac (SortPoint_TPDT LtsPoint kccum))
	     )
	     ((= Style "PTDT")
	      (setq LtsZichZac (SortPoint_PTDT LtsPoint kccum))
	     )
	   )

Đoạn này lặp lại 4 lần. Dài 1 chút nhưng giải quyết được vấn đề 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

Dùng eval & read & strcat có thể dồn 4 đoạn trên thành 1.

VD: (eval (read (strcat "(se" "tq" " a " "10)" )))

Nhưng kết hợp 4 hàm SortPoint thành 1 có lẽ tốt hơn

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
13 giờ trước, ngokiet đã nói:

Làm gì khó hiểu vậy. 4 hàm kia kết hợp làm 1 thì

(setq LtsZichZac ((read(strcat “SortPoint_” style)) LtsPoint kccum)) 

Tuy nhiên phải chắc chăn style là 1 trong 4 giá trị trên

 

Bạn test xem dòng code dễ hiểu

(setq LtsZichZac ((read(strcat “SortPoint_” style)) LtsPoint kccum)) 

có chạy được không?

Cách lập trình của tôi là kết hợp 4 hàm SortPoint thay cho kết hợp 4 lệnh gọi,   trên đó chỉ là VD kết hợp 4 lệnh gọi

Có thể có cách kết hợp khác hay hơn, nếu bạn nào biết xin chia sẻ.

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
1 giờ} trướ}c, ndtnv đã nói:

Bạn test xem

(setq LtsZichZac ((read(strcat “SortPoint_” style)) LtsPoint kccum)) 

có chạy được không?

Cách lập trình của tôi là kết hợp 4 hàm SortPoint thay cho kết hợp 4 lệnh gọi,   trên đó chỉ là VD kết hợp 4 lệnh gọi

Có thể có cách kết hợp khác hay hơn, nếu bạn nào biết xin chia sẻ.

Cảm ơn bác đã quan tâm đến bài viết của em. Em test của bác không được bác ạ!

Nó lỗi tại dòng của 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

Dòng đó là của bạn ngokiet

Theo cách của tôi là:

(setq LtsZichZac (eval (read (strcat "(SortPoint_" style " LtsPoint kccum)" ))))

  • Like 1
  • 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

1 ví dụ viết theo cách viết cho gọn của anh ndtnv để thanhduan dễ hiểu:


(defun C:HA()
 (setq x 1 y 2)
 (initget "TDTP DTTP TPDT PTDT")
 (setq style (getkword "\nStyle [TDTP/DTTP/TPDT/PTDT]: "))
 (setq LstZickZac (eval (read (strcat "(SortPoint_" style " x y " ")")))))
(defun SortPoint_TDTP(x y)
 (+ x y))
(defun SortPoint_DTTP(x y)
 (- x y))
(defun SortPoint_TPDT(x y)
 (* x y))
(defun SortPoint_PTDT(x y)
 (/ x y))

  • Like 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

có ai biết sửa líp tính cốt đai rồi ghi vào dim với công thức (d-100)/a+1 không giúp em với em có cái líp sẵn rồi

;-------------------------------------------------------------------------------------------------------------------------
;          ==============>>  GT: TINH SL DAI VA GHI VAO DIM <<================ 
;-------------------------------------------------------------------------------------------------------------------------

(defun C:gt(/ ctc ss)
  (or *ctc* (setq *ctc* 200))
  (initget 6)
  (setq ctc (getint (strcat"\nNh\U+1EADp b\U+01B0\U+1EDBc th\U+00E9p < " (itoa *ctc*) ">:")) )
  (if ctc (setq *ctc* ctc))
  (if (setq ss (ssget"_:L" (list (cons 0 "DIMENSION")) ))
    (progn
      (command "_.undo" "_begin")    
      (foreach ent (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
(vla-put-TextOverride (vlax-ename->vla-object ent)
   (strcat "<>\\X" (itoa (+ (fix(/ (cdr (assoc 42 (entget ent))) *ctc*)) 1))
    "%%c10A" (itoa *ctc*)))    )
      (command "_.undo" "_end") (princ)  )))
(defun C:cl(/ num ss)
  (if (setq ss (ssget"_:L"))
    (progn
      (command "_.undo" "_begin")
      (or *num* (setq *num* 15))
      (initget 4)
      (setq num (getint (strcat"\nNhap color <" (itoa *num*) ">:")) )
      (while (not (if num (<= num 256)T) )
(princ "\nGia tri <=256.")
(setq num (getint (strcat"\nNhap color <" (itoa *num*) ">:")) ))
      (if num (setq *num* num))
      (foreach ent (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
(vla-put-Color (vlax-ename->vla-object ent)*num* )    )
      (command "_.undo" "_end") (princ)  )))

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
Vừa xong, CASAUBAOCHUA đã nói:

có ai biết sửa líp tính cốt đai rồi ghi vào dim với công thức (d-100)/a+1 không giúp em với em có cái líp sẵn rồi

Topic này không phải để sửa lisp nhé bạn! Bạn nên mở topic khác chứ đưa vào đây sẽ lạ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
37 phút trước, ndtnv đã nói:

Dòng đó là của bạn ngokiet

Theo cách của tôi là:

(setq LtsZichZac (eval (read (strcat "(SortPoint_" style " LtsPoint kccum)" ))))

 

26 phút trước, Doan Van Ha đã nói:

1 ví dụ viết theo cách viết cho gọn của anh ndtnv để thanhduan dễ hiểu:



(defun C:HA()
 (setq x 1 y 2)
 (initget "TDTP DTTP TPDT PTDT")
 (setq style (getkword "\nStyle [TDTP/DTTP/TPDT/PTDT]: "))
 (setq LstZickZac (eval (read (strcat "(SortPoint_" style " x y " ")")))))
(defun SortPoint_TDTP(x y)
 (+ x y))
(defun SortPoint_DTTP(x y)
 (- x y))
(defun SortPoint_TPDT(x y)
 (* x y))
(defun SortPoint_PTDT(x y)
 (/ x y))

Cảm ơn anh @ndtnv và bác @Doan Van Ha nhiều! 

Thiếu "(" và ")" là cái em/cháu vướ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
2 giờ trước, ndtnv đã nói:

Bạn test xem dòng code dễ hiểu

(setq LtsZichZac ((read(strcat “SortPoint_” style)) LtsPoint kccum)) 

có chạy được không?

Cách lập trình của tôi là kết hợp 4 hàm SortPoint thay cho kết hợp 4 lệnh gọi,   trên đó chỉ là VD kết hợp 4 lệnh gọi

Có thể có cách kết hợp khác hay hơn, nếu bạn nào biết xin chia sẻ.

Thanks bác sửa dùm do quên test. 

Nhưng mình thích 

(setq LtsZichZac ((eval(read(strcat “SortPoint_” style))) LtsPoint kccum)) 

hơn vì eval không phải chạy lệ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
 
 
1
39 phút trước, ngokiet đã nói:

Thanks bác sửa dùm do quên test. 

Nhưng mình thích 

(setq LtsZichZac ((eval(read(strcat “SortPoint_” style))) LtsPoint kccum)) 

hơn vì eval không phải chạy lệnh.

Nếu không cho LtsPoint kccum vào dấu " " thì sẽ bị lỗi 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

Lỗi sao được mà lỗi Duan ơi.

Thử thay dòng này vào dòng của ndtnv xem:


(setq LtsZichZac ((eval (read(strcat "SortPoint_" style))) x y))

  • Like 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
1 giờ} trướ}c, Doan Van Ha đã nói:

Lỗi sao được mà lỗi Duan ơi.

Thử thay dòng này vào dòng của ndtnv xem:

 

  • cadvietlisp.lsp
    lisp help
  •  


(setq LtsZichZac ((eval (read(strcat "SortPoint_" style))) x y))

 

Sorry bác Doan Van Ha. Cháu nhầm với phía trên khi biến chưa xác định. Lúc này là hàm đã xác định rồi.

11 phút trước, ngokiet đã nói:

Mình giải thích cho bạn 

- Hàm eval trả về giá trị biến.

- Hàm read đọc tên biến.

Tuy nhiên mình cảm thấy nếu bác viết lại hàm sortpoint thành 1 hàm có các trường hợp thì hay hơn vì bác cũng phải làm 4 hàm tương tự nhau. Mình viết như vậy để bác có thể dùng hàm như biến, biến như hàm thì linh động hơn.

Mình share cho bạn hàm sort 2 chiều theo 8 trường hợp luôn

  • cadvietlisp.lsp
    lisp help
  •  

(defun sortx(s1 st / f1 f2 f3 f4)
  (mapcar 'set '(f1 f2 f3 f4)
	  (mapcar 'eval
		  (nth st '((cadr car > >)
			    (cadr car > <)
			    (cadr car < <)
			    (cadr car < >)              
			    (car cadr > >)
			    (car cadr > <)
			    (car cadr < <)
			    (car cadr < >)))))
  (vl-sort s1 '(lambda(x y) (if (equal  (f1 x) (f1 y) 0.1)
			      (f4 (f2 x) (f2 y))
			      (f3 (f1 x) (f1 y))))))

Bác có thể thay đổi theo ý mình và chỉnh sửa cũng dễ.

St : Là style của bạn (Bạn có thể dùng là (vl-position style '("PTTD" "TPTD" ....))

Mình nghĩ nên dùng style là số thì dễ hơn.

Đây là mình sử dụng các biến fx là các hàm tương ứng khi sort.

Cảm ơn bác! Em vội quá chưa test, cứ nghĩ ở câu hỏi hôm qua. Cảm ơn bác cho ví dụ dễ hiểu và dễ học hỏ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

Nhờ các bác viết giúp hàm tạo list chỉ chứa các số từ 1 chuỗi với. Nghĩa là khoàng trống, và các ký tự khác số  bỏ hết và cho ra list chỉ chứa các chuỗi chứa số.

Mong muốn như này: Chuổi "1325   a21 hjjdf       254" thành list ("1325" "21" "254")

Cám ơn!

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 STR-NUMBER (str / LST LST1 LST2)
  (setq lst (vl-string->list str))
 (SETQ LST1 (LIST))
  (while (setq X (car LST))
    (setq LST (CDR LST))
    (SETQ LST2 (LIST))
    (IF (AND (>= X 48) (<= x 57)) (PROGN (SETQ LST2 (APPEND LST2 (LIST X)))
	(WHILE (AND (>= (car LST) 48) (<= (car LST) 57))
	 (SETQ LST2 (APPEND LST2 (LIST (car LST))))
	  (SETQ LST (CDR LST))
	  )
	(SETQ LST1 (APPEND LST1 (LIST LST2)))
	))
    )(MAPCAR '(LAMBDA (X) (vl-list->string X)) LST1)
  )

Chỉnh sửa lại mất title, viết lại k bác hiểu nhầm. 

Gửi bác test nhé. 

(str-number  "1325   a21 hjjdf       254") ->  ("1325" "21" "254")

  • Like 1
  • 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

Lâu nay không lisp nên heo ủi gần hết. Cho hỏi có hàm nào đọc số phần tử trong list không ạ.

(list "ds" "dsfsdfsdfdsfsd") ra thành 2 ấy

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
3 phút trước, duy782006 đã nói:

Lâu nay không lisp nên heo ủi gần hết. Cho hỏi có hàm nào đọc số phần tử trong list không ạ.

(list "ds" "dsfsdfsdfdsfsd") ra thành 2 ấy

(length 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
2 giờ trước, duy782006 đã nói:

Nhờ các bác viết giúp hàm tạo list chỉ chứa các số từ 1 chuỗi với. Nghĩa là khoàng trống, và các ký tự khác số  bỏ hết và cho ra list chỉ chứa các chuỗi chứa số.

Mong muốn như này: Chuổi "1325   a21 hjjdf       254" thành list ("1325" "21" "254")

Cám ơn!

Nếu dùng acet

(setq str  "1325   a021 hjjdf       254")
(vl-remove-if ''((x) (= x ""))
    (acet-str-to-list " " (vl-list->string (mapcar ''((x)(if (<= 48 x 57) x 32)) (vl-string->list str)))))

-> ("1325" "021" "254")

  • 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

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

×