0
votes

Différent ": Cl" manipulation de paquet entre implémentations de LISP communes

Pourquoi ce comportement se produit-il? strong> De plus, est-ce une «mise en oeuvre définie» de disparité, ou est l'une de ces réponses incorrectes?

Veuillez considérer ce code LISP commun ... em> p>

; in: + 2
;     (NEW::+ 2 2)
;
; caught COMMON-LISP:STYLE-WARNING:
;   undefined function: NEW::+
;
; compilation unit finished
;   Undefined function:
;     +
;   caught 1 STYLE-WARNING condition

debugger invoked on a COMMON-LISP:UNDEFINED-FUNCTION in thread
#<THREAD "main thread" RUNNING {1000508083}>:
  The function NEW::+ is undefined.


0 commentaires

3 Réponses :


1
votes

Vous pouvez spécifier des packages à partir desquels pour hériter des symboles dans défavackage avec : Utilisez ou pouvez appeler use-package à la même fin ; Je le fais habituellement dans Defpackage . Je ne savais pas que Cmluck s'est comporté différemment que SBCL à cet égard, mais j'inclus toujours (: Utilisation: commun-lisp) dans mes packages. L'Hyperspec de défavackage Documentation dit: si : Utiliser n'est pas fourni, il est par défaut de la même valeur dépendante de la mise en œuvre en tant que : Utilisez argument sur make-package . ici vous Peut voir une différence entre cmll et sbcl:

cmucl


xxx

sbcl


xxx

La fonction la fonction indique que le package neuf utilise commun-lisp dans cmll, mais pas dans SBCL. Vous pouvez éviter de telles questions par explicitement Utiliser packages: xxx

Il serait typique dans un fichier à utiliser : exporter Dans le formulaire DEFPACKAGE pour exporter des symboles, mais à partir du package Répétuel dans le nouveau Vous pouvez également définir des fonctions et exporter leurs symboles à utiliser dans d'autres packages: xxx

puis revenez à l'espace de travail principal, le package commun-lisp-utilisateur et appelez use-package pour accéder au nouveau Fonction: xxx


1 commentaires

Si ma mémoire est correcte (et ce n'est probablement pas), la raison pour laquelle SBCL a décalé qu'il était surprenant des personnes que l'utilisation de l'emballage : cl ne fonctionnait plus une fois que vous avez commencé à spécifier d'autres packages avec < Code>: Utilisez-le-package .



3
votes

Il est indéfini dans la norme CL quels paquets à utiliser quand il n'y a pas de : Utilisez la clause dans Defparackage.

CLHS: Defquackage :

Les arguments à: Utilisez Définir les packages que le package nommé par le nom du paquet héritera de. Si: l'utilisation n'est pas fournie, il est par défaut à la même valeur dépendante de la mise en œuvre comme: Utilisez l'argument pour faire un package.

SBCL a choisi de ne pas utiliser tout package.

Traditionnellement, une autre implémentation CL choisit généralement de utiliser le package CL et des paquets d'extension. L'intention était alors qu'un nouveau package est par défaut utile pour la programmation LISP comme le package cl-utilisateur . .

Pour le code portable, vous devez spécifier quels packages un paquet doit utiliser . Habituellement défenseur et make-package sont les opérateurs à regarder.


0 commentaires

0
votes

Ceci est un addendum aux autres réponses.

Une chose que j'ai faite dans le passé consiste à écrire une macro comme ceci: xxx

en utilisant alors xxx

définira un package "comme" utilisateur CL en ce sens qu'il utilise tous les mêmes packages, et cela fera cela d'une manière qui fonctionne à travers des implémentations.


0 commentaires