2010-05-17 13 views
19

To jest moja funkcja:Czy można wykonać wiele instrukcji w instrukcji "if"?

(defun MyFunction(input) 
    (let ((NEWNUM (find input num))) 
    (if (find input num)    //if this 
     (setq num NEWNUM) (FUNCT2)  //then execute both of these 
    (list 'not found))))    //else output this 

Więc po oświadczeniu if Chcę być w stanie wykonać (setq num NEWNUM) następnie (FUNCT2) w celu ustawienia nowej zmiennej, a następnie wywołać funkcję. Wszelkie pomysły, jak to zrobić?

+0

Lekki offtopic: wydaje się, że zmienna "num" jest zmienną specjalną/dynamiczną (tj. Globalną). Najprawdopodobniej go nie potrzebujesz. –

+0

Który dialekt Lisp jest tym kodem? –

Odpowiedz

33

Aby zrobić kilka rzeczy w sekwencji, potrzebujesz progn.

(defun MyFunction(input) 
    (let ((NEWNUM (find input num))) 
    (if (find input num)    //if this 
     (progn 
     (setq num NEWNUM) 
     (FUNCT2))  //then execute both of these 
    (list 'not found))))    //else output this 
+2

Zamiast 'progn' możesz również użyć' prog1', które zwróci wartość pierwszego wyrażenia. – jcubic

12

Gdy if jest „jednoręki”, jak nazywają go (to znaczy, że nie zawiera else oddział), to zazwyczaj łatwiejsze i bardziej idiomatyczne użycie when i unless: http://www.cs.cmu.edu/Groups/AI/html/hyperspec/HyperSpec/Body/mac_whencm_unless.html

Kiedy zadzwonisz pod numer (when pred x y ... z), po prostu oceni się x y z, jeśli pred jest prawdziwe. unless zachowuje się podobnie, gdy pred ma wartość NIL. x y z może reprezentować dowolną liczbę instrukcji od jednego wzwyż. Zatem:

(when pred (thunk)) 

jest tak samo jak

(if pred (thunk)) 

Niektórzy mówią when i unless powinny być zawsze stosowane w 'jednorękiego-IFS' ze względu na przejrzystość.

Edytuj: Twoja nić wpadła mi na pomysł. To makro:

(defmacro if/seq (cond then else) 
    `(if ,cond (progn ,@then) (progn ,@else))) 

powinno umożliwić w ten sposób:

(if/seq (find input num)    //if this 
     ((setq num NEWNUM) (FUNCT2))  //then execute both of these 
    ((list 'not found))))) 

Więc ogólnie format:

(if/seq *condition* (x y ... z) (a b ... c)) 

W zależności od stanu, ocenia wszystkie podformularze w pierwszy lub drugi , ale zwraca tylko ostatnią.

6

Nie można używać wielu instrukcji z if, z wyjątkiem progn, jak opisano powyżej. Ale nie jest to forma cond,

(cond 
((find input num)  // if this 
    (setq num NEWNUM) // then execute both of these 
    (FUNCT2)) 

(t 
    (list 'not found))) // else output this 
1

Wystarczy dodać, można również użyć (begin EXP1 EXP2 ...) składni do oceny więcej niż jeden wyraz w Lisp sekwencyjnie. Użycie tego w gałęzi "if" będzie miało taki sam efekt jak użycie wielu instrukcji.

+1

'begin' Myślę, że jest tylko w schemacie i ma wspólny kod septyczny, więc musi użyć' progn' lub 'prog1' – jcubic

Powiązane problemy