Quelle est la différence entre '(a b c) et (liste' a 'b' c)?
-
07-07-2019 - |
Question
Je lis " On lisp " et rencontré ce code (je l'ai simplifié un peu).
CL-USER> (defun foo ()
'(a b c))
FOO
CL-USER> (foo)
(A B C)
CL-USER> (nconc * '(D E))
(A B C D E)
CL-USER> (foo)
(A B C D E)
CL-USER> (defun foo ()
(list 'a 'b 'c))
STYLE-WARNING: redefining FOO in DEFUN
FOO
CL-USER> (foo)
(A B C)
CL-USER> (nconc * '(D E))
(A B C D E)
CL-USER> (foo)
(A B C)
-
Que signifie exactement
*
? Est-ce l'appel de fonction précédent? Est-il approprié d'utiliser le code du monde réel? -
Pourquoi
(nconc * '(D E))
modifie-t-il la valeur de retour de la première fonctionfoo
? -
J'ai toujours pensé que
(liste 'a' b 'c)
et' (a b c)
sont les mêmes? Quelle est la différence?
La solution
L’appel à la liste crée une nouvelle liste à chaque évaluation. Le littéral de liste peut être placé dans un segment de mémoire en lecture seule après la compilation. Une mise à jour destructive des listes avec NCONC est alors problématique, avec éventuellement des conséquences indéterminées (erreur de segmentation, modification du littéral pour les références futures, ou rien du tout).
Autres conseils
Les variables *
, **
et ***
sont spécifiées par le langage standard et sont très utiles pour tester des éléments. Ils sont une caractéristique du REPL et ne sont donc pas, et ne sont pas supposés être utiles, dans un "code du monde réel".