2010-05-17 3 views
19

C'est ma fonction:Pouvez-vous exécuter plusieurs instructions dans une instruction "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 

Ainsi, après la déclaration if je veux être en mesure d'exécuter (setq num NEWNUM) suivi par (FUNCT2) afin de définir une nouvelle variable puis appeler une fonction. auriez vous des idées pour faire ça?

+0

Léger hors-sujet: il semble que la variable 'num' soit une variable spéciale/dynamique (c'est-à-dire globale). Très probablement, vous n'en avez pas besoin. –

+0

Quel dialecte Lisp est ce code écrit? –

Répondre

33

Pour faire plusieurs choses dans l'ordre, vous voulez 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

Au lieu de 'progn', vous pouvez aussi utiliser' prog1', qui retournera la valeur de la première expression. – jcubic

12

Lorsque votre if est « manchot », comme ils l'appellent (qui est, il ne contient pas de branche else), il est généralement plus facile et plus idiomatiques à utiliser when et unless: http://www.cs.cmu.edu/Groups/AI/html/hyperspec/HyperSpec/Body/mac_whencm_unless.html

Lorsque vous appelez (when pred x y ... z), il va juste évaluer x y z séquentiellement si pred est vrai. unless se comporte de manière similaire lorsque pred est NIL. x y z peut représenter un nombre quelconque d'instructions à partir d'une seule. Ainsi:

(when pred (thunk)) 

est la même chose que

(if pred (thunk)) 

Certaines personnes disent when et unless doivent toujours être utilisés pour « manchot ifs » en raison de la clarté.

Editer: Votre fil m'a donné une idée. Cette macro:

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

devrait permettre ceci:

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

Ainsi, le format général est:

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

En fonction de l'état, il évalue toutes les sous-formulaires dans le premier ou le deuxième , mais ne renvoie que le dernier.

6

Vous ne pouvez pas utiliser plusieurs instructions avec if, sauf avec progn comme indiqué ci-dessus. Mais il y a la forme cond,

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

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

Juste pour ajouter, vous pouvez également utiliser le (début exp1 exp2 ...) la syntaxe pour évaluer plus d'une expression dans Lisp séquentielle. L'utiliser sur une branche if aura le même effet que l'utilisation de plusieurs instructions.

+1

'begin' Je pense que c'est seulement dans le schéma et il a un code Lisp commun donc il doit utiliser' progn' ou 'prog1' – jcubic