未调用的变量

时间:2012-11-07 23:23:59

标签: compilation lisp

我正在尝试使用Lisp,我有一些(杂乱的)代码,我希望能够向用户询问标题和网址。

将它们保存在变量中,然后在调用时将它们打印出来。我遇到了麻烦。首先,我不知道如何编译我的程序来运行它。此外,有一次当我运行它时,我得到一个关于变量标题未被调用的错误。任何人都可以帮我解决这些问题吗?抱歉,我无法向您提供有关错误的更多信息。

;;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*))

2 个答案:

答案 0 :(得分:1)

也许这会有所帮助。

Lisp程序并不总是以编译形式分发。让你的程序只是源代码甚至更好,只有FASL(这是如何调用Lisp二进制文件),因为它可以更容易修复问题,如果以后找到它们。

传统上,更复杂的程序是通过ASDF包asdf:defsystem宏来安排的。您可以在此处详细了解:http://common-lisp.net/~mmommer/asdf-howto.shtml。您可以在互联网上找到示例,了解如何通过使用Quicklisp并查看其~/quicklisp/dists/quicklisp/software/<name of the program>/目录以查看其他程序的排列方式。

系统由asdf:defsystem定义后,您可以使用asdf:oos来操作&#34;在它上面,就是加载它。但是,Quicklisp已经成为一个非常流行且易于使用的实用程序,用于处理Lisp系统(它也使用了ASDF包)。所以,考虑到你拥有它,然后你会(ql:quickload "your-system")

为了通过Quicklisp使您的系统在本地可用,我建议您这样做:在$HOME目录中(在Linux上,它通常使用波浪号~替换)文件:~/.config/common-lisp/source-registry.conf(您可能需要创建一个,如果它不存在),请添加以下内容:

(:source-registry
 (:tree (:home "quicklisp/quicklisp/"))
 (:tree (:home "Projects/my-project/"))
 :inherit-configuration)

以上意味着~/Projects/my-project/目录包含系统定义文件(* .asd),您可以在其中描述哪些文件属于系统并指示如何加载它们等。

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

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

这在开始时有点涉及,所以我建议您使用Quicklisp安装一个项目并研究它是如何制作的。亚历山大港可能是一个良好的开端 - 除了是一个普遍有用的方案,它不是非常大,并且很好地说明了这个问题,IMO。

答案 1 :(得分:0)

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

(defun make-url( title url )
      (list :title title :url url))

注意括号展示位置的差异。

在您的代码中,参数列表后面有一个额外的括号。这关闭了defun,导致make-url被评估为没有身体的功能。然后将下一行评估为对内置函数列表的调用。对参数进行了评估,并在尝试查找title的值时遇到错误。在全局环境中没有绑定,标题的绑定仅存在于make-url的主体内。

此外,您的add-url定义已被注释掉。分号开始在Lisp中发表评论。

如何编译和运行程序取决于您使用的编译器。如果您使用的是SBCL,则函数为sb-ext:save-lisp-and-die。像这样的简单程序通常在Read-Eval-Print-Loop(REPL)中运行,大多数编译器在启动时都会输入一个。如果安装了SBCL,则可以通过在命令提示符下输入命令“SBCL”来启动repl。如果您的代码位于外部文件中,则可以使用Load加载该代码。

相关问题