0
votes

Pourquoi (FREST-IF # 'CONNE' CONSP '(' NOTDEFINDSYMBOL)) => 'NOTDEFINDSYMBOLO

Ce code est venu du tampon Emacs slime-reply SBCL :

CL-User> (Cons 'NotDefineDsymbol)

nil

CL-User> (Recherche-si # 'Consp' ('NotDefineDsymbol))

'NotDefineDsymbol

Si CEC renvoie NIL, alors pourquoi trouver-la-chose comme si C ESC renvoie une valeur réelle?


0 commentaires

3 Réponses :


3
votes

avec (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>

avec la seconde que vous avez (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>

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>

(find-if #'consp '(notdefinedsymbol)) ; ==> nil


0 commentaires

1
votes

(consp 'a) - Les arguments de fonction sont évalués en premier. Nous avons donc: 'A évalue à: a . Et c'est un atome, donc nil .

(trouver-si # 'consp' ('a)) évacue également les arguments d'abord. Mais pour le premier argument de la liste, il teste si 'A est un inconvénient. C'est parce que c'est (citation a) (seul l'extérieur ' de la liste est évalué, l'intérieur devant a non, Par conséquent, 'a .

a = notdefinedsymbol .


0 commentaires

1
votes

Votre appel: (Recherche-si # 'Consp' (Symbole non défini)) est identique à (c'est-à-dire expansenté par le lecteur à) (Recherche-si (Fonction Consp) (citation ((((titre)))) . L'argument (citation (((((titre))) est évalué à la liste ((Symbole non défini non défini)) (c.-à-d. Une liste contenant un Liste contenant les deux symboles citation et non défini-symbole ). Recherche-si passe à travers cette liste extérieure, teste l'intérieur, qui est un inconvénient, avec Consp , qui dit vrai et le renvoie.

Ce que vous vouliez faire est probablement: (trouver-si # 'consp' (symbole non défini)) , lequel est identique à (Recherche-if ​​(Fonction Consp) (citation (symbole non défini)) . Remarque: Pas de citation imbriquée.

Regardez The Docs pour Devis et Le chapitre CLHS sur l'évaluation pour une meilleure compréhension.


0 commentaires