Compilation 未调用变量

Compilation 未调用变量,compilation,lisp,Compilation,Lisp,我正在尝试开始使用Lisp,我有一些(混乱的)代码,我希望能够要求用户提供标题和url 将它们保存在变量中,然后在调用时打印出来。不过我遇到了麻烦。首先,我不知道如何编译我的程序来运行它。还有一次,当我运行它时,我得到了一个关于变量title未调用的错误。有人能帮我做这两件事吗?很抱歉,我无法向您提供有关错误的更多信息 ;;Define a function called make-cd that takes four parameters (defun make-url( title url

我正在尝试开始使用Lisp,我有一些(混乱的)代码,我希望能够要求用户提供标题和url

将它们保存在变量中,然后在调用时打印出来。不过我遇到了麻烦。首先,我不知道如何编译我的程序来运行它。还有一次,当我运行它时,我得到了一个关于变量title未调用的错误。有人能帮我做这两件事吗?很抱歉,我无法向您提供有关错误的更多信息

;;Define a function called make-cd that takes four parameters
(defun make-url( title url ))
    (list :title title :url url)

;;In the make-url function create a plist that takes the passed values


;; Define global variable db and set its value to nil
(defvar *db* nil)

;; Define a function that takes one paramter and pushes it to the make-url func.
;;(defun add-url (url) (push url *db*))

;; Define a function that takes the *db* variable and makes the output pretty
(defun dump-db ()
   (dolist (url *db*)
       (format t "~{~a:~10t~a~%~}~%" url)))

(defun prompt-read (prompt)
  (format *query-io* "~a: " prompt)
  (force-output *query-io*)
  (read-line *query-io*))

您提供的代码包含错误,无法编译。错误在makeURL的定义中。正确的定义应该是:

(defun make-url( title url ) (list :title title :url url)) (定义生成url(标题url) (列表:标题:url)) 请注意括号位置的差异

在代码中,参数列表后面还有一个括号。这关闭了defun,导致makeurl作为一个没有主体的函数进行计算。然后,下一行被评估为对内置函数列表的调用。对参数进行了求值,在尝试查找title的值时遇到错误。全局环境中没有绑定,标题绑定只存在于makeurl的主体中

此外,添加url的定义也会被注释掉。在Lisp中,分号以注释开头


如何编译和运行程序取决于您使用的编译器。如果使用SBCL,则函数为。像这样一个简单的程序通常在REPL中运行,大多数编译器在启动时都会进入REPL。如果已安装SBCL,则可以通过在命令提示符下输入命令“SBCL”来启动repl。如果代码位于外部文件中,则可以使用加载该文件。

这可能会有所帮助

Lisp程序并不总是以编译的形式分发。将您的程序作为源代码比只使用FASL(这就是Lisp二进制文件的调用方式)更好,因为如果以后发现问题,可以更容易地解决问题

传统上,更复杂的程序是通过ASDF包
ASDF:defsystem
宏来安排的。您可以在此处阅读更多信息:。您可以在internet上找到这样的示例,通过使用和查看其
~/quicklisp/dists/quicklisp/software/
目录来了解其他程序的排列方式

一旦系统由
asdf:defsystem
定义,您将使用
asdf:oos
对其进行“操作”,即加载它。然而,Quicklisp已经成为一个非常流行且易于使用的实用工具,用于处理Lisp系统(它也在下面使用ASDF包)。因此,考虑到您拥有它,您将
(ql:quickload“您的系统”)

为了使您的系统通过Quicklisp在本地可用,我建议您这样做:在您的
$HOME
目录中(在Linux上,它通常使用tilde
~
)添加如下内容:
~/.config/common lisp/source registry.conf
(如果还没有,您可能需要创建一个目录):

(:source-registry
 (:tree (:home "quicklisp/quicklisp/"))
 (:tree (:home "Projects/my-project/"))
 :inherit-configuration)
上述内容意味着
~/Projects/my project/
目录包含一个系统定义文件(*.asd),您在其中描述了哪些文件属于系统,并说明了如何加载这些文件等

有关添加本地项目的其他选项,请阅读

有关source-registry.conf文件格式的详细信息,请阅读


这在开始时有点复杂,所以我建议您使用Quicklisp安装一个项目,并研究它是如何制作的。亚历山大港可能是一个很好的开端——除了是一个普遍有用的一揽子计划外,它不是很大,并且很好地说明了这一问题,国际海事组织。

“传统”由ASDF安排?ASDF相对较新。@Kaz大约10年了,我想你是在问我为什么说问题中的代码不会编译?如果在封闭环境中未绑定title或url,则表达式(list:title:url-url)将不会编译。如果按问题所示输入,则将在全局环境中对其进行评估,并将发出错误信号,因为标题未绑定。我认为这就是OP所说的“关于变量标题未调用的错误”的意思