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

Hỏi về hàm COND

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

Các bạn làm ơn cho mình hỏi về hàm COND:

Ví dụ mình có đoạn lisp sau:

(setq str "")
(setq x 15)
(cond
 ((> x 1) (setq str (strcat str "123")))
 ((> x 10) (setq str (strcat str "456")))
 )
(princ str)

Nếu x=5, hàm trên trả về "123"

Nếu x=15, hàm trên trả về "123"

Vậy mình muốn hỏi là có hàm nào tương tự, hoặc mình phải sửa hàm cond như thế nào để giá trị str nó sẽ trả về "123456", chứ không phải "123", hay kể cả "456".

Mình xin 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

Thì như mình đã ví dụ ở trên kia, mình muốn nếu x=15, nó sẽ đi qua tất cả các điều kiện nó thỏa mãn chứ không phải dừng lại ở điều kiện đầu tiên nó thỏa 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

Cụ thể như này:

(setq str "")
(setq x 15)
(cond
 ((> x 1) (setq str (strcat str "123")))
 ((> x 10) (setq str (strcat str "456")))
 )
(princ str)

Hàm trên trả về "123", mình muốn hỏi là có hàm nào tương tự, hoặc mình phải sửa hàm cond như thế nào để giá trị str nó sẽ trả về "123456", chứ không phải "123", hay kể cả "456".

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 thử cái này xem có ổn không???

((lambda (/ x str)
  (setq str "")
  (setq x 15)
  (foreach k  '(((> x 1) (princ "123")) ((> x 10) (princ "456")) ((> x 20) (princ "KKK")))
   (if (eval (car k))
    (setq str (strcat str (eval (cadr k))))))
  (princ)))

P/s: Không dùng cond.

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

Bạn thử cái này xem có ổn không???

((lambda (/ x str)
  (setq str "")
  (setq x 15)
  (foreach k  '(((> x 1) (princ "123")) ((> x 10) (princ "456")) ((> x 20) (princ "KKK")))
   (if (eval (car k))
    (setq str (strcat str (eval (cadr k))))))
  (princ)))

P/s: Không dùng cond.

Mình thấy cách của bạn có vẻ không tổng quát lắm, vậy trường hợp kết quả của các điều kiện là nhiều hàm, biểu thức không liên quan đến nhau thì sao, giả sử không phải là (princ "...") mà là các hàm entdel, entmod, ... thì cách của bạn có làm được không ?

  • Vote giảm 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
16 phút trước, Doan Van Ha đã nói:

Chú phải nghe bác. Mấy trường hợp này nên rút lui sớm để an toàn tính mạng.

Đúng là gừng càng già càng cay! Chú cần phải học hỏi nhiều.

  • Like 1
  • Vote giảm 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ồng thử phát đây. Từ từ coi tình hình rồi rút hé hé.

(defun c:ntt ()
(setq str "")
(setq x 15)
(cond
 ((> x 1) (setq str (strcat str "123"))
 (cond
 ((> x 10) (setq str (strcat str "456")))
 )
 )
 )
(princ str)
)

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 thấy các bạn đều là những người am hiểu và có kinh nghiệm về lisp, mình chỉ hỏi về tên cú pháp hàm, vì mình mới học nên chưa biết nhiều hàm.

Một câu trả lời kiểu như "Lisp không có hàm đó đâu bạn" cũng làm mình vừa lòng, nhưng xem ra các bạn đã quá giỏi r nên chắc không muốn giúp những người mới.

Mình nghĩ mình sẽ dùng các hàm IF liên tục, dù sao cũng cảm ơn các bạn !

  • 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

Như này nhé, mình rất trân trọng những ai giúp đỡ mình, ở trên mình đã cảm ơn họ, còn bạn "Doan Van Ha" cho đến trước comment cuối cùng này, hình như là bạn chưa có ý giúp mình, và mình còn cảm thấy có chút gì đó mỉa mai trong comment của bạn. Chắc chắn như bạn nói ở trên rồi, mình không trân trọng bạn, ít nhất là chưa cần trân trọng bạn.

Quay lại chủ đề này, mình biết hàm COND sẽ dừng lại khi tmđk, và mình muốn hỏi có hàm nào khác thay thế nó không, và mình vẫn chưa nhận được câu trả lời.

  • Vote tăng 1
  • Vote giảm 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
34 phút trước, Duong Nhat Duy đã nói:

Như này nhé, mình rất trân trọng những ai giúp đỡ mình, ở trên mình đã cảm ơn họ, còn bạn "Doan Van Ha" cho đến trước comment cuối cùng này, hình như là bạn chưa có ý giúp mình, và mình còn cảm thấy có chút gì đó mỉa mai trong comment của bạn. Chắc chắn như bạn nói ở trên rồi, mình không trân trọng bạn, ít nhất là chưa cần trân trọng bạn.

Quay lại chủ đề này, mình biết hàm COND sẽ dừng lại khi tmđk, và mình muốn hỏi có hàm nào khác thay thế nó không, và mình vẫn chưa nhận được câu trả lời.

Mình cũng là một người học lisp qua diễn đàn và cũng nhờ "Doan Van Ha" giải đáp nhiều vấn đề nên theo mình vấn đề này là do bạn đưa ra nó không rõ ràng cụ thể. 

Điều kiện nó bị chồng nhau x=15 thì tất nhiên nó lớn hơn 1 và 10 nên bài toán trả về kết quả "123"

tại sao bạn không làm điều kiện

1. (1<x<=10) cho ra 123

2. (10<x<15) cho ra 456

3. (x=>15) cho ra 123456

 

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ôi cũng biết tọc mạch một chút về lisp, không phải giỏi . Vậy sẽ trả lời đơn giản là không có hàm cơ bản nào của lisp thực hiện được yêu cầu của bạn :)

Với lại, yêu cầu của bạn cảm giác nó hơi kỳ. Vì lisp nếu chạy, không ràng buộc điều kiện gì thí nó cứ tàng tàng đi từ đấu tới cuối. Vậy thì rõ ràng là hàm Cond cũng không cần thiết phải sử dụng. Thế nên mọi người mới nghĩ bạn đánh đố. Bạn biết về lisp thì cũng nên hiểu và chấp nhận điều nà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

@Duong Nhat DuyBạn Ha đã nói Bạn sai về toán học và cách làm việc của hàm Cond rồi. Tại sao Bạn không sắp xếp hàm cond lại xem kết quả như thế nào

(cond
 ((> x 10) (setq str (strcat str "456")))
 ((> x 1) (setq str (strcat str "123")))
 (T (setq str (strcat str "Không thỏa mãn bất cứ điều kiện nào thì chạy dòng nà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

Cảm ơn bạn Danh Cong và bạn tien2005,

Mình không hề có ý đánh đố ai cả, ở trên mình còn nhận là mình mới học nên còn chưa biết được nhiều hàm.

Mình hiểu cách làm việc của hàm COND, mình không thắc mắc là tại sao nó lại chạy ra như vậy, mình chỉ lấy nó làm ví dụ cho câu hỏi của mình. Ít ra thì mình cũng tìm được câu trả lời là không có hàm nào của lisp làm việc được như vậ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
Vào lúc 4/9/2018 tại 12:41, Duong Nhat Duy đã nói:

Cảm ơn bạn Danh Cong và bạn tien2005,

Mình không hề có ý đánh đố ai cả, ở trên mình còn nhận là mình mới học nên còn chưa biết được nhiều hàm.

Mình hiểu cách làm việc của hàm COND, mình không thắc mắc là tại sao nó lại chạy ra như vậy, mình chỉ lấy nó làm ví dụ cho câu hỏi của mình. Ít ra thì mình cũng tìm được câu trả lời là không có hàm nào của lisp làm việc được như vậy.

Nếu không tính hàm IF riêng lẻ thì trường hợp sau vẫn coi là hàm IF làm được việc của bạn

(setq a "123")

(setq b "456")

(setq str "")

(setq x 15)

(if (< x 11) (setq str(strcat str a))(setq str(strcat str a b)))

(princ str)

Có đúng không nhỉ

P/S: có thể thay (setq a) (setq b) là hàm hoặc biểu thức thay cho (setq str(strcat str a)) và (setq str(strcat str a b))

như vậy có đúng ý bạn hỏi không

Chỉnh sửa theo Biet ve CAD

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

Nếu không tính hàm IF riêng lẻ thì trường hợp sau vẫn coi là hàm IF làm được việc của bạn

(setq a "123")

(setq b "456")

(setq str "")

(setq x 15)

(if (< x 11) (setq str(strcat str a))(setq str(strcat str a b)))

(princ str)

Có đúng không nhỉ

P/S: có thể thay (setq a) (setq b) là hàm hoặc biểu thức thay cho (setq str(strcat str a)) và (setq str(strcat str a b))

như vậy có đúng ý bạn hỏi không

Cảm ơn bạn. Mình thấy các bạn có vẻ chú ý quá nhiều đến cái ví dụ của mình nên toàn viết cụ thể cho mỗi trường hợp đấy. Tóm lại câu trả lời của mình là:

(if (điều kiện 1) (kết quả 1) (ko có else gì hết))

(if (điều kiện 2) (kết quả 2) (ko có else gì hết))

...vv

Vậy là đơn giản và tổng quát nhấ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

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  

×