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 fonction foo ?

  • J'ai toujours pensé que (liste 'a' b 'c) et ' (a b c) sont les mêmes? Quelle est la différence?

Était-ce utile?

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".

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top