Ce code est venu du tampon Emacs slime-reply SBCL em>: p>
CL-User> (Cons 'NotDefineDsymbol) P>
nil p>
CL-User> (Recherche-si # 'Consp' ('NotDefineDsymbol)) P>
'NotDefineDsymbol P>
blockQuote>
Si CEC renvoie NIL, alors pourquoi trouver-la-chose comme si C ESC renvoie une valeur réelle? P>
3 Réponses :
avec avec la seconde que vous avez Votre erreur est bien sûr que vous nidez des devis. Si vous l'aviez fait comme ça, vous obtenez le résultat attendu: p> (consp 'notdefinedsymbol) code> Consp code> dans la position de l'opérateur est un symbole pour la fonction #' Consp code> et c'est donc argument (Quote NotDefineDsymbol) Code>, abrégé comme juste 'NotDefineDsymbol code> doit être évalué avant application. A (citation x) code> Evalue sur les données x code> dans notre cas, l'argument devient le symbole notdefinedsymbol code>. Ce n'est pas un contre code> mais un symbole code> et donc le résultat est nil code> (Recherche-si # 'Consp' ('notdefinedsymbol)) code> et puisque Recherche-si code> est une fucntion qu'il évalue ses arguments. # 'Consp code> est évalué à l'objet de fonction et ' ('notdefinedsymbol) code> qui est court pour (citation (((((ciote notdefinedsymbol))) code> est évalué . Comme toujours, il a évalué à son argument qui est ((citation notdefinedsymbol)) code>. C'est une liste avec un élément qui lui-même est une liste avec deux éléments, les symboles ciote code> et notdefineDsymbol code>. Depuis (consp '(citation notdefinedsymbol); ==> t code> Recherche-si code> évalue vers (citation notdefineDsymbol) Code> et certaines imprimantes CL abrégeront A abréger un Liste de deux éléments sur lesquels le premier élément est code> de la même manière que le lecteur macro et imprimer 'notdefinedsymbol code> mais il est toujours une liste de deux éléments puisqu'il n'est pas de code , mais les données. P> (find-if #'consp '(notdefinedsymbol)) ; ==> nil
(consp 'a) code> - Les arguments de fonction sont évalués en premier. Nous avons donc: 'A code> évalue à: a code>. Et c'est un atome, donc nil code>. P>
(trouver-si # 'consp' ('a)) code> évacue également les arguments d'abord. Mais pour le premier argument de la liste, il teste si 'A code> est un inconvénient. C'est parce que c'est (citation a) code> (seul l'extérieur ' code> de la liste est évalué, l'intérieur devant a code> non, Par conséquent, 'a code>. p>
a = notdefinedsymbol code>. p>
Votre appel: Ce que vous vouliez faire est probablement: Regardez The Docs pour (Recherche-si # 'Consp' (Symbole non défini)) code> est identique à (c'est-à-dire expansenté par le lecteur à) (Recherche-si (Fonction Consp) (citation ((((titre)))) code>. L'argument (citation (((((titre))) code> est évalué à la liste ((Symbole non défini non défini)) code> (c.-à-d. Une liste contenant un Liste contenant les deux symboles citation code> et non défini-symbole code>). Recherche-si code> passe à travers cette liste extérieure, teste l'intérieur, qui est un inconvénient, avec Consp code>, qui dit vrai em> et le renvoie. p>
(trouver-si # 'consp' (symbole non défini)) code>, lequel est identique à em> (Recherche-if (Fonction Consp) (citation (symbole non défini)) code>. Remarque: Pas de citation imbriquée. P>
Devis Code> et Le chapitre CLHS sur l'évaluation pour une meilleure compréhension. P>