gpt4 book ai didi

lisp - 不能使用系统中定义的 lisp 包

转载 作者:太空宇宙 更新时间:2023-11-03 18:44:52 24 4
gpt4 key购买 nike

我正在尝试使用 lisp 代码制作可执行文件。但是我根本无法编译 lisp 文件,因为在加载helloworld 系统之前没有hellowolrd

;; test.lisp
(asdf:load-system :helloworld)

(defun main()
(helloworld:start))


当然,我做了helloworld系统,放在了~/quicklisp/local-projects/helloworld 系统成功加载,没有错误。

;; ~/quicklisp/local-projects/helloworld/helloworld.asd
(asdf:defsystem helloworld
:version "1.0"
:components ((:file "package")))

;; ~/quicklisp/local-projects/helloworld/package.lisp
(defpackage :helloworld
(:use :common-lisp :asdf)
(:export :start))

(in-package :helloworld)
(defun start()
(format t "Welcome, ASDF"))


我想在不显式加载的情况下编译 test.lisp。我还尝试了 use-packagedefpackage 但失败了。

;; test.lisp
(asdf:load-system :helloworld)
(use-package :helloworld)

(defun main()
(helloworld:start))


;; test.lisp
(asdf:load-system :helloworld)

(defpackage :test
(:use :cl :asdf)
(:export :main))

(in-package :test)

(defun main()
(helloworld:start))


如何在不加载的情况下使用helloworld 系统中定义的helloworld 包?我是否必须使用 helloworld 系统创建一个新系统?

最佳答案

在这段代码中,发生了一些有趣的事情:

;; test.lisp
(asdf:load-system :helloworld)

(defun main()
(helloworld:start))

您不能将它作为一个整体进行编译,因为正如您所注意到的,尝试读取符号 hellowworld:start 是一个问题,因为还没有 helloworld 包。要读取符号,您至少需要定义包。但是,为什么我们不会遇到与 (asdf:load-system :helloworld) 相同的问题?简单地说,ASDF 包已经被定义(实现包括它,或者你已经加载它,或者其他东西。你可以做的一件事就是在编译时确保你已经加载了你的 helloworld 系统:

;; test.lisp
(eval-when (:compile-toplevel)
(asdf:load-system :helloworld))

(defun main()
(helloworld:start))

这应该让你编译文件;因为你会在编译时评估加载形式,然后包将在你定义 main 时定义。

当然,现在您将拥有一个已编译的文件,但是如果您将它加载到尚未加载 helloworld 系统的新 Lisp 实例中会发生什么?你会遇到问题。所以你真的想在你加载文件时加载那个系统,并且可能如果你也只是从文件中执行表单(例如,如果你一次读取一个表单并评估它们)。因此,您可能想在另外两种情况下评估该负载系统:

;; test.lisp
(eval-when (:compile-toplevel :load-toplevel :execute)
(asdf:load-system :helloworld))

(defun main()
(helloworld:start))

综上所述,请务必考虑这是否是在这种情况下加载系统的最合适方式。如果出于某种原因,您试图将所有代码保存在一个文件中,或者制作一个交付脚本,这可能是有意义的。另一方面,如果您正在制作另一个 ASDF 可加载系统,那么您可能只包含 helloworld 作为依赖项并让 ASDF 处理加载依赖项。

关于lisp - 不能使用系统中定义的 lisp 包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25759530/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com