0

我正在尝试开始使用 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*))
4

2 回答 2

1

也许这会有所帮助。

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

传统上,更复杂的程序是通过 ASDF 包asdf:defsystem宏来安排的。你可以在这里阅读更多关于它的信息:http: //common-lisp.net/~mmommer/asdf-howto.shtml。您可以在 Internet 上找到示例,这些示例通常通过使用Quicklisp来完成,并查看其~/quicklisp/dists/quicklisp/software/<name of the program>/目录以查看其他程序的排列方式。

一旦系统由 定义asdf:defsystem,您将使用asdf:oos它来“操作”它,即加载它。然而,Quicklisp 已经成为一个非常流行且易于使用的实用程序,用于处理 Lisp 系统(它也使用下面的 ASDF 包)。所以,考虑到你有它,你会(ql:quickload "your-system")的。

为了通过 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),您在其中描述了哪些文件属于系统并说明了如何加载它们等。

有关添加本地项目的其他选项,请阅读Quicklisp 常见问题解答

有关 source-registry.conf 文件格式的更多信息,请阅读ASDF 手册

这在开始时有点涉及,所以我建议你只使用 Quicklisp 安装一个项目并研究它是如何制作的。Alexandria 可能是一个好的开始 - 除了作为一个普遍有用的软件包之外,它不是很大并且很好地说明了这个问题,IMO。

于 2012-11-08T08:33:55.630 回答
0

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

(defun make-url( 标题 url )
      (列表:标题标题:url url))

注意括号位置的不同。

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

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

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

于 2012-11-08T01:30:13.813 回答