2013-04-01 2 views
0

je un exercice que j'ai la fonction suivante:Weird tapé fonction

(defun ifnot (test e1 e2) 
    (if test e2 e1)) 

on me demande de décrire l'évaluation de l'expression suivante:

(ifnot nil "OK" (error "Unexpected test outcome")) 

Je ne sais pas si le problème est sur le jeton "nil" ou sur l'erreur intégrée, pouvez-vous m'aider?

+1

Quel problème? L'exercice consiste à déterminer quand et si les arguments d'une fonction sont évalués. – sepp2k

+0

L'exercice dit évaluer l'appel de fonction (ifnot nil "OK" ...) produira une erreur, je me demande ce que l'erreur sera – user2233777

+0

résultat de test inattendu? '(ifnot nil ...)' _should_ fonctionne comme '(si t ...)' Est-ce que ça marche? –

Répondre

2

ifnot, comme vous l'avez écrit, est une fonction. Lorsqu'une fonction est évaluée, tous les arguments sont évalués avant que le corps de la fonction soit évalué. Alors que la valeur de e2 est rejetée dans votre exemple, e2 est toujours évaluée, et error est toujours appelée. Si elle était une macro à la place, il travaillerait comme vous semblez l'intention:

(defmacro ifnot (test e1 e2) 
    `(if ,test ,e2 ,e1)) 

De cette façon, le code

(ifnot nil "OK" (error "Unexpected test outcome")) 

est remplacé par ce au moment de la compilation:

(if nil (error "Unexpected test outcome") "OK")