2016-11-19 19 views
6

W elisp, logika instrukcji if pozwala mi tylko na przypadek i na inny przypadek.Elisp: jak mogę wyrazić jeszcze inny - if

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

ale co, jeśli chcę zrobić coś innego, jeśli? Czy muszę wstawić nowe oświadczenie if w innym przypadku? Po prostu wydaje się trochę nieporządny.

+3

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

Odpowiedz

11

zagnieżdżanie jeśli

Od częściach (if test-expression then-expression else-expression)else if byłoby gnieździe nowy if jako else-expression:

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

Korzystanie cond

W innych językach na else if jest zwykle na ten sam poziom. W sepsie mamy do tego cond. Tutaj jest dokładnie to samo z cond:

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

Zauważmy, że wyrażenie może być tylko to. Każde wyrażenie tak często są takie jak (some-test-p some-variable), a inne wyrażenia zwykle też są. Bardzo rzadko są to pojedyncze symbole do oceny, ale mogą to być bardzo proste warunki.

+1

Powiedziałbym, że" use 'cond'" jest prawdopodobnie najbardziej idiomatycznym rozwiązanie. Czasami rzeczy są wyraźniejsze z zagnieżdżonymi ifs, ale to jest tak rzadko, że "use' cond' "jest sensownym pierwszym podejściem. – Vatine

+0

@Vatine Zgadzam się tak długo, jak długo drzewo jest ciężkie na jednej gałęzi. Jeśli masz coś takiego '' if (red? O) (if (square? O) 'red-square' red-round) (if (square? O) 'blue-square' blue-round)) 'dostajesz z daleko mniejszą liczbą testów niż '(cond ((i (red? o) (square? o)) 'red-square) ((red? o)' red-round) ((square? o) 'blue-square) (t 'blue-round)) '. Dla średnio 3,25 testów na czas względem 2 i z "cond" kod jest nieco bardziej niechlujny do naśladowania. Nigdy nie używam słowa "cond", jeśli nie używam żadnej z dodatkowych funkcji zamiast 'if'. na przykład. '(jeśli test to jeszcze)' Nigdy nie piszę jako 'cond'a – Sylwester

+0

Tak, jednym z powodów, dla których nie powiedziałem" nigdy go nie używaj ". Są chwile, kiedy zagnieżdżone 'if' (lub wiele' when', zawijane w 'lub', z 'if' wewnątrz) jest bardziej przejrzyste niż' cond'. – Vatine