【问题标题】:I can't use setq in sbcl [LISP]我不能在 sbcl [LISP] 中使用 setq
【发布时间】:2016-08-01 09:41:09
【问题描述】:

我尝试查看相关问题,但找不到关于如何在 Common LISP 中定义变量的直接答案。我使用 sbcl 实现,并且一直在使用教程来帮助我学习语言,但出于某种原因,这段代码:

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

返回错误:变量 XX 未绑定。我还会收到有关 while 和消息的样式警告。有人可以为我指出这段代码的问题所在吗?

【问题讨论】:

  • 普通 Lisp。 XX 未定义。你还没有定义它。您可能想要定义它。虽然不存在。请参见循环。 MESSAGE 也不存在。看起来不像 Common Lisp。也许您应该先检查语言参考。它们也是 APROPOS 和 DOCUMENTATION 等内置工具,应该会有所帮助。
  • “我一直在使用教程来帮助我学习这门语言,但出于某种原因,这段代码”您能否提供该教程的链接? while 不是 Common Lisp 中的循环宏(尽管您可以轻松定义一个),所以要么本教程不是一个很棒的教程,要么不是一个普通的 lisp 教程,要么在尚未完全复制的上下文。
  • 我会推荐this而不是任何网络教程。
  • 设置未定义的变量会产生未定义的后果。尝试将其放入文件并编译该文件。您会看到 CLISP 编译器会抱怨未绑定/未声明的变量。
  • @DanielJour:但是setq 指的是“命名变量的符号”:如果符号未绑定,则不会命名变量。

标签: lisp common-lisp sbcl


【解决方案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))

您可能还会发现Difference between `set`, `setq`, and `setf` in Common Lisp? 很有帮助。

【讨论】:

    【解决方案2】:

    这个教程好像不是普通的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 中运行它会提示许多错误 unknown function, unbound variables,...

    由于 cmets 展示了一个很好的 lisp 教程或一本书,我推荐 Paul Graham 的 ANSI Common lisp,但如果你喜欢 Conrad barski 的有趣的 Lisp Land of 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 vs defparameter,特殊变量...循环,很多东西我几年前开始学习lisp,我认为这是一次了不起的旅行

    【讨论】:

      猜你喜欢
      • 2013-08-12
      • 2011-04-20
      • 1970-01-01
      • 1970-01-01
      • 2010-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多