2016-11-19 12 views
6

Trong elisp, nếu logic tuyên bố chỉ cho phép tôi một trường hợp nếu và trường hợp khác.Elisp: làm thế nào tôi có thể thể hiện khác-nếu

(if (< 3 5) 
    ; if case 
    (foo) 
    ; else case 
    (bar)) 

nhưng nếu tôi muốn làm điều gì khác thì sao? Tôi có cần phải đặt một câu lệnh if mới trong trường hợp khác không? Nó chỉ có vẻ hơi lộn xộn một chút.

+3

Xem ['cond'] (https://www.gnu.org/software/emacs/manual/html_node/elisp/Conditionals.html) – jkiiski

Trả lời

11

lồng nhau nếu

Kể từ khi các bộ phận của (if test-expression then-expression else-expression) một else if sẽ được tổ mới if như else-expression:

(if test-expression1 
    then-expression1 
    (if test-expression2 
     then-expression2 
     else-expression2)) 

Sử dụng cond

Trong các ngôn ngữ khác else if thường nằm ở Cùng trình độ. Trong lisps chúng tôi có cond cho điều đó. Đây là chính xác giống với một số cond:

(cond (test-expression1 then-expression1) 
     (test-expression2 then-expression2) 
     (t else-expression2)) 

Lưu ý rằng một biểu thức có thể là như vậy. Bất kỳ biểu thức nào thường xuyên như vậy đều giống như (some-test-p some-variable) và các biểu thức khác thường là quá. Nó rất hiếm khi họ chỉ là những biểu tượng duy nhất được đánh giá nhưng nó có thể được cho điều kiện rất đơn giản.

+1

Tôi sẽ nói rằng" sử dụng "cond'" có lẽ là thành ngữ nhất dung dịch. Đôi khi, mọi thứ rõ ràng hơn với các if lồng nhau, nhưng điều đó hiếm khi "sử dụng" cond' "là một cách tiếp cận đầu tiên hợp lý. – Vatine

+0

@Vatine Tôi đồng ý miễn là nếu cây nặng trên một nhánh. Nếu bạn có một cái gì đó như thế này '(nếu (màu đỏ? O) (nếu (vuông? O) 'hình vuông màu đỏ' màu đỏ tròn) (nếu (vuông? O) 'ô vuông xanh' màu xanh lam tròn))' bạn nhận được với các phép thử ít hơn so với '(cond ((và (đỏ? o) (vuông? o)) 'hình vuông màu đỏ) ((đỏ? o)' đỏ tròn) ((vuông? o) 'ô vuông xanh) (t 'blue-round)) '. Đối với trung bình 3,25 bài kiểm tra mỗi lần so với 2 và với 'cond' mã là hơi lộn xộn hơn để làm theo. Tôi không bao giờ sử dụng 'cond' nếu tôi không sử dụng bất kỳ tính năng bổ sung nào trên' if'. ví dụ. '(nếu thử nghiệm sau đó khác)' Tôi không bao giờ viết là 'cond' – Sylwester

+0

Vâng, một trong những lý do tại sao tôi không nói" không bao giờ sử dụng nó ". Có lần khi lồng nhau 'if' (hoặc nhiều' khi', được bao bọc trong một 'hoặc', với' if' bên trong) là rõ ràng hơn một 'cond'. – Vatine

Các vấn đề liên quan