我正在尝试使用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*))
答案 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加载该代码。