2010-05-17 19 views
19

Esta es mi función:¿Se pueden ejecutar sentencias múltiples en una instrucción "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 

Así que después de la declaración if Quiero ser capaz de ejecutar (setq num NEWNUM) seguido por (FUNCT2) con el fin de establecer una nueva variable y luego llamar a una función. ¿Alguna idea sobre cómo hacer esto?

+0

Offtopic leve: parece que la variable 'num' es una variable especial/dinámica (es decir, global). Lo más probable es que no necesites uno. –

+0

¿En qué dialecto Lisp está escrito este código? –

Respuesta

33

Para hacer varias cosas en secuencia, quiere 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

En lugar de 'progn' también puede usar' prog1', que devolverá el valor de la primera expresión. – jcubic

12

Cuando su if es 'manco', como lo llaman (es decir, que no contiene else rama), es típicamente más fácil y más idiomática utilizar when y unless: http://www.cs.cmu.edu/Groups/AI/html/hyperspec/HyperSpec/Body/mac_whencm_unless.html

Cuando llama al (when pred x y ... z), simplemente evaluará x y z secuencialmente si pred es verdadero. unless se comporta de manera similar cuando pred es NIL. x y z puede representar cualquier cantidad de declaraciones de una hacia arriba. Por lo tanto:

(when pred (thunk)) 

es lo mismo que

(if pred (thunk)) 

Algunas personas dicen when y unless siempre debe usarse para 'one-tal sí armados', debido a la claridad.

Editar: El hilo me hizo una idea. Esta macro:

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

debe habilitar esta:

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

lo tanto, el formato general es:

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

Dependiendo de la condición, que evalúa todos los subformularios en el primer o segundo , pero solo devuelve el último.

6

No puede usar varias declaraciones con if, excepto con progn como se publicó anteriormente. Pero no es la 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

Sólo para añadir, también se puede utilizar la sintaxis (comienza el exp2 exp1 ...) para evaluar más de una expresión en forma secuencial Lisp. Usar esto en una rama de if tendrá el mismo efecto que usar múltiples instrucciones.

+1

'begin' Creo que solo está en el esquema y tiene un código de lisp común, así que necesita usar' progn' o 'prog1' – jcubic

Cuestiones relacionadas