Buscar..


Observaciones

ASDF - Otra facilidad de definición de sistema

ASDF es una herramienta para especificar cómo los sistemas del software Common Lisp se componen de componentes (subsistemas y archivos), y cómo operar estos componentes en el orden correcto para que puedan compilarse, cargarse, probarse, etc.

Sistema ASDF simple con una estructura de directorio plana.

Considere este proyecto simple con una estructura de directorio plana:

example
|-- example.asd
|-- functions.lisp
|-- main.lisp
|-- packages.lisp
`-- tools.lisp

El archivo example.asd es en realidad otro archivo Lisp con poco más que una llamada de función específica de ASDF. Asumiendo que su proyecto depende de los sistemas drakma y clsql , su contenido puede ser algo como esto:

(asdf:defsystem :example
    :description "a simple example project"
    :version "1.0"
    :author "TheAuthor"
    :depends-on (:clsql
                 :drakma)
    :components ((:file "packages")
                 (:file "tools" :depends-on ("packages"))
                 (:file "functions" :depends-on ("packages"))
                 (:file "main" :depends-on ("packages"
                                            "functions"))))

Cuando carga este archivo Lisp, le dice a ASDF sobre su :example sistema de :example , pero todavía no está cargando el sistema en sí. Esto se hace mediante (asdf:require-system :example) o (ql:quickload :example) .

Y cuando cargue el sistema, ASDF:

  1. Cargue las dependencias, en este caso los sistemas ASDF clsql y drakma
  2. Compile y cargue los componentes de su sistema, es decir, los archivos Lisp, según las dependencias dadas
    1. packages primero (sin dependencias)
    2. functions después de los packages (ya que solo depende de los packages ), pero antes de main (que depende de ellos)
    3. functions main posteriores (ya que depende de packages y functions )
    4. tools cualquier momento después de los packages

Tenga en cuenta:

  • Ingrese las dependencias según sean necesarias (por ejemplo, las definiciones de macro son necesarias antes del uso). Si no lo hace, ASDF producirá un error al cargar su sistema.
  • Todos los archivos enumerados terminan en .lisp pero este postfix debe eliminarse en el script asdf
  • Si su sistema tiene el mismo nombre que su archivo .asd , y mueve (o enlace simbólico) su carpeta a quicklisp/local-projects/ folder, puede cargar el proyecto usando (ql:quickload "example") .
  • Las bibliotecas de las que depende su sistema deben ser conocidas por ASDF (a través de ASDF:*CENTRAL-REGISTRY variable) o Quicklisp (ya sea a través de QUICKLISP-CLIENT:*LOCAL-PROJECT-DIRECTORIES* variable o disponible en cualquiera de sus dists)

Cómo definir una operación de prueba para un sistema

(in-package #:asdf-user)

(defsystem #:foo
  :components ((:file "foo"))
  :in-order-to ((asdf:test-op (asdf:load-op :foo)))
  :perform (asdf:test-op (o c)
                    (uiop:symbol-call :foo-tests 'run-tests)))

(defsystem #:foo-tests
  :name "foo-test"
  :components ((:file "tests")))

;; Afterwards to run the tests we type in the REPL
(asdf:test-system :foo)

Notas:

  • Estamos asumiendo que el sistema : foo-tests define un paquete llamado "FOO-TESTS"
  • run-tests es el punto de entrada para el corredor de prueba
  • uoip: symbol-call permite definir un método que llama a una función que aún no se ha leído. El paquete en el que se define la función no existe cuando definimos el sistema

¿En qué paquete debo definir mi sistema ASDF?

ASDF proporciona el paquete ASDF-USER para que los desarrolladores definan sus paquetes en.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow