我在sbcl [LISP]中无法使用setq。

3

我尝试查看相关问题,但是我没有找到一个明确的答案来告诉我应该如何在Common LISP中定义变量。我使用sbcl实现,并且一直在使用教程来帮助我学习这种语言,但出现了这段代码:

;;print a line many times
(setq xx 1)
(while (< xx 20)
  (message "yay")
  (setq xx (1+ xx))
  )

返回一个错误:变量XX未绑定。同时,我还得到了while和message的样式警告。有人能指点一下这段代码存在什么问题吗?

2
Common Lisp。XX未定义。您还没有定义它。您可能想要定义它。WHILE不存在。请参见LOOP。MESSAGE也不存在。看起来不像是Common Lisp。也许您应该先检查语言参考。还有内置工具,如APROPOS和DOCUMENTATION,可以帮助您。 - Rainer Joswig
2
我一直在使用教程来帮助我学习这门语言,但出于某种原因,这段代码中的"while"不是Common Lisp中的循环宏(虽然你可以轻松地定义一个),所以要么这个教程不是很好,要么不是一个通用的Lisp教程,或者提供了这个代码的上下文没有完全复制。请问您能提供该教程的链接吗? - Joshua Taylor
2
设置未定义的变量会产生未定义的后果。尝试将其放入文件并编译该文件。您会发现CLISP编译器会抱怨未绑定/未声明的变量。 - Rainer Joswig
1
@DanielJour:然而,setq是指“命名变量的符号”:如果一个符号未绑定,则它不会命名一个变量。 - user5920214
1
关于这一点的说明:我猜这应该是elisp代码(基于whilemessage)。 - user5920214
显示剩余7条评论
2个回答

1

这篇教程似乎不是关于通用Lisp的,而是更多关于Emacs Lisp的。要执行这些函数,请使用Emacs和ielm命令。

*** Welcome to IELM ***  Type (describe-mode) for help.
ELISP> ;print a line many times
(setq xx 1)
(while (< xx 20)
  (message "yay")
  (setq xx (1+ xx))
  )
*** IELM error ***  More than one sexp in input
ELISP> (setq xx 1)
1 (#o1, #x1, ?\C-a)
ELISP> (while (< xx 20)
     (message "yay")
     (setq xx (1+ xx)))
nil
ELISP> (message "yay")
"yay"
ELISP> (while (> xx 20)
     (message "yay")
     (setq xx (1+ xx)))
nil
ELISP> xx
20 (#o24, #x14, ?\C-t)
ELISP> 

这是代码无法运行的原因之一,如果您在SBCL REPL中运行它,会提示许多未知函数、未绑定变量等错误。正如注释所示,建议您学习一些好的Lisp教程或书籍,我推荐Paul Graham的《ANSI Common Lisp》,如果您喜欢有趣的话,可以看看Conrad Barski的《Lisp国度》。至于您的Lisp代码,可能类似于以下内容:
CL-USER> (dotimes (xx 20 xx) (print "yay"))
"yay"
"yay"
"yay"
"yay"
"yay"
"yay"
"yay"
"yay"
"yay"
"yay"
"yay"
"yay"
"yay"
"yay"
"yay"
"yay"
"yay"
"yay"
"yay"
"yay"
20

你需要学习如何定义变量,setq与defparameter的区别,特殊变量...循环,我在几年前开始学习Lisp,学到了很多东西,我认为这是一次很棒的旅程。

1
如果你的问题标题和/或未绑定编译器的投诉是你来到这里的原因,那么你感兴趣的答案可能被埋藏在anquegi的答案底部附近:考虑(首先)使用defvardefparameterlet。前两个通常用作顶层形式。相比之下,let用于在有限范围内建立“临时”命名变量。
 ;; define *xx* so that it can be "seen" globally
 (defparameter *xx* 23)
 ;; establish a variable which is only "seen" locally
 (let ((xx 0))
   (format t "xx: ~S~%" xx)
   (incf xx)
   (format t "xx: ~S~%" xx))

您可能会发现Common Lisp中`set`、`setq`和`setf`的区别有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接