2011-12-07 14 views
8

El siguiente ejemplo se da en Paul Graham ANSI Common Lisp como un ejemplo de hacer encapsulación:¿Es mejor poner el defpackage en un archivo separado al crear paquetes

(defpackage "CTR" 
    (:use "COMMON-LISP") 
    (:export "COUNTER" "INCREMENT" "CLEAR")) 

(in-package ctr) 

;function definitions here 

Sin embargo, en Peter Seibels práctica Common Lisp, enlace here, dice:

Dado que los paquetes son utilizados por el lector, un paquete debe ser definido antes de poder cargar o compile-file un archivo que contiene un IN-pAQUETE expresión de cambiar a ese paquete. Los paquetes también se deben definir antes de que otros formularios DEFPACKAGE puedan referirse a ellos ... El mejor primer paso para asegurarse de que existan paquetes cuando necesitan es colocar todos sus DEFPACKAGE en archivos separados del código que necesita leer en esos paquetes

Por lo tanto, recomienda crear dos archivos para cada paquete, uno para el paquete de desempate y otro para el código. Los archivos que contienen defpackages deberían comenzar con (paquete "COMMON-LISP-USER").

Para mí, parece que colocar el desfmpage en el mismo archivo, antes del paquete y el código, es una buena forma de asegurarse de que el paquete esté definido antes de usarse. Entonces, el primer método, reunir todo en un archivo parece más fácil. ¿Hay algún problema con el uso de este método para la creación de paquetes?

Respuesta

8

creo que el uso de un archivo separado para defpackage es un buen hábito porque:

  • no «contaminar» sus archivos con defpackage.
  • Hace que sea más fácil encontrar los símbolos exportados/sombreados/..., usted sabe que solo tiene que mirar package.lisp.
  • No tiene que preocuparse por el orden cuando utiliza ASDF.

    (defsystem :your-system 
        :components ((:file "package") 
           ... the rest ...))` 
    
  • Peter Seibel lo dice;)

EDIT: me olvidó mencionar quickproject que facilita la creación de nuevos proyectos CL.

REPL> (quickproject:make-project "~/src/lisp/my-wonderful-project/" 
           :depends-on '(drakma cl-ppcre local-time))` 

Este comando creará un directorio "~/src/lisp/my-wonderful-project/" y los siguientes archivos:

  • package.lisp
  • my-wonderful-project.asd (filled)
  • my-wonderful-project.lisp
  • README.txt

Y así, creo que es bueno usar la misma convención.

+2

Creo que el motivo de la orden es la razón más importante de esas, y hay otra: paquetes divididos en varios archivos. –

+1

Estoy de acuerdo con usted, excepto en el caso de los proyectos de un solo archivo, donde puede poner la definición del paquete en el mismo archivo. AFAIK, no está prohibido por el estándar. –

+0

Múltiples archivos y pedidos cuando se usa ASDF tiene sentido. Los primeros dos puntos parecen más como preferencia individual. – snowape

1

Tiendo a usar múltiples archivos de código fuente, un único archivo "packages.lisp" y un archivo de definición de sistema "project.asd" para la mayoría de mis proyectos. Si el proyecto requiere múltiples paquetes, todos están definidos en "packages.lisp", con las exportaciones relevantes en su lugar exportadas.

0

Existe una razón para poner DEFPACKAGE en su propio archivo: si tiene un paquete grande, puede tener varios grupos de funciones relacionadas, y es posible que desee tener archivos de origen separados por grupo de funciones. Entonces, todos los archivos fuente tendrían su propio IN-PACKAGE en la parte superior, pero todos "compartirían" el DEFPACKAGE externo. Entonces, siempre que cargue primero el DEFPACKAGE, no importa el orden en que cargue los otros archivos fuente.

Un ejemplo en el que estoy trabajando actualmente tiene varias clases en el paquete, y los archivos fuente están divididos por clase, cada uno con una definición de clase y la función genérica relacionada y las definiciones de métodos.

Cuestiones relacionadas