我有以下目录结构:
\nmy-project/\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 my-project.asd\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 package.lisp # defpackage.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 utils.lisp # Functions used by main.lisp.\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 main.lisp # Main program.\nRun Code Online (Sandbox Code Playgroud)\nmy-project.asd:
(defsystem "my-project"\n :components ((:file "package")\n (:file "utils")\n (:file "main")))\nRun Code Online (Sandbox Code Playgroud)\npackage.lisp:
(defpackage :com.example\n (:use :cl))\nRun Code Online (Sandbox Code Playgroud)\nutils.lisp:
(in-package :com.example)\n\n(defun double (x)\n (* x 2))\nRun Code Online (Sandbox Code Playgroud)\nmain.lisp:
(in-package :com.example)\n\n(format t "~a" (double 3))\nRun Code Online (Sandbox Code Playgroud)\n问题是:如何main.lisp使用 ASDF 进行编译和运行?
我能够通过以下方式编译并运行该程序:
\n$ mv my-project ~/common-lisp/.\n$ sbcl\n* (require :asdf)\n* (asdf:load-system :my-project)\nRun Code Online (Sandbox Code Playgroud)\n然而,这是非常愚蠢的。我不想将我的项目转移到~/common-lisp/只是为了运行它。我想直接从项目目录本身编译并运行该程序。该my-project/目录可以在任何地方,我希望它可以放在任何地方。换句话说,我想从当前目录加载系统。
想想make,我可以直接从其本身的目录编译文件Makefile。我如何从*.asd文件本身的目录中类似地编译和运行 Common Lisp 程序?
(我使用的是 SBCL 版本 1.4.5 和 ASDF 版本 3.3.1)
\n我发现可以执行以下操作:
\n$ sbcl\n* (require "asdf")\n* (asdf:load-asd (merge-pathnames "my-project.asd" (uiop:getcwd)))\n* (asdf:load-system :my-project)\nRun Code Online (Sandbox Code Playgroud)\n笔记:
\n(require "asdf")根据ASDF 手册的“加载 ASDF”部分,这是加载 ASDF 的推荐方法。
\n\n注意:除 GNU CLISP 之外的所有实现也接受
\n(require "ASDF"),(require \'asdf)和(require :asdf)。为了可移植性\xe2\x80\x99s,您应该使用(require "asdf").
asdf:load-asd必须是绝对路径,并且当给定的路径不正确时(!),可能不会因任何错误而失败,因此请确保给定的绝对路径正确。
使用cl:load代替asdf:load-asd似乎也可行,但 ASDF 手册明确警告不要这种做法:
\n\n事实上,ASDF 不会
\n.asd简单地使用 加载文件cl:load,您也不应该使用。当您在系统上运行时,您应该让 ASDF 找到并加载它们。如果您必须加载文件,请使用ASDF 使用的.asd相同函数。asdf:load-asd除此之外,它已经绑定了*package*toasdf-user。最新版本的 SLIME(2013-02 及更高版本)知道当您C-c C-k使用slime-asdfcontrib 时要执行此操作。