【问题标题】:Why am I getting an unbound error for "atom?"为什么我收到“atom”的未绑定错误?
【发布时间】:2013-05-31 17:19:25
【问题描述】:

我正在尝试通读“The Little Lisper”,但在第一章中已经遇到了障碍。我对 Emacs 比较陌生(这激发了我对学习 Lisp 和 clojure 的兴趣)。我下载了 Mit-scheme 应用程序,并正在 Edwin 上进行练习。

我正在尝试:

(atom? (cons a l))

其中 a 是一个原子,l 是一个已经定义的列表。我收到以下错误:

;Unbound variable: atom?

为什么?我使用“null”没有问题?功能。我想“原子?”是一个内部函数,检查返回的值是否为原子。

任何解释将不胜感激。我还没有设置我的emacs来运行scheme,所有lisp方言之间的细微差别正在考验我的耐心。

【问题讨论】:

  • Scheme 和 Lisp 不一样,scheme 没有atom? 谓词。但是您可以轻松实现自己的:stackoverflow.com/questions/5404707/…
  • 我确实看到了那个帖子,但我认为我没有正确理解它。我知道我的错误是我试图在以方案模式运行的“Edwin”中进行这些练习。你能告诉我任何其他应用程序,我可以在其中尝试使用“The Little Lisper”的示例吗?我应该在 emacs 上尝试 sbcl 吗?仍在努力通过 define/defun/defn 适合的地方:-)
  • 您可以尝试clisp,但您也可以切换到方案书。经典Structure and interpretation of computer programs 的完整文本可免费获得。
  • atom? 不是 Common Lisp(由 clisp 实现)中的函数。事实上,在 Common Lisp 中,谓词通常以“p”后缀命名,因此名称 atom? 确实暗示了 Scheme。
  • @AndersLindahl Lisp 今天其实有点模棱两可,但在 70 年代小 Lisper 出来的时候就不是这样了。 1978 年的 R1RS 在 MacLisp 上运行,并使用原语中的实现和名称。因此 atom、eq 和 null 是 R1RS 原语。在 R2RS 中,他们从问号开始,从那时起,这就是 Scheme 和 Common Lisp 之间的一个明显区别。 SICP 视频说他们教你 Lisp,但它确实是 R3RS。

标签: lisp scheme mit-scheme the-little-schemer


【解决方案1】:

在“The Little Schemer”(“The Little Lisper”的更新版本)中,atom? 过程定义如下(因为 atom? 在 Scheme 中不存在):

(define (atom? x)
  (and (not (null? x))
       (not (pair? x))))

如果您正在关注这本书的旧版本,我建议您要么寻找更新版本,要么使用书中使用的相同编程语言:The Little Lisper 的 Common Lisp,The Little Schemer 的 Scheme - 和Racket 是一个很棒的 Scheme IDE!在使用 Racket 浏览 The Little Schemer 时,请查看 answer 获取一些提示。

【讨论】:

  • 我有第三版的 PDF。我的错误是跳过了前言,其中明确提到需要定义原子函数。另外,我尝试在 Scheme 编辑器上运行 Lisp 命令,但并没有完全理解两者之间的差异,从而加剧了这个错误。我会坚持使用 Emacs 的 SBCL。
  • @Tavore,我不会将 SBCL 与 The Little Lisper 一起使用。 Little Lisper 使用的是 Scheme,而不是 Common Lisp,即使它被称为“The Little Lisper”而不是“The Little Schemer”。 (正如您所发现的,它在前言中定义了atom?。)脚注告诉您如何在 CL 中做同样的事情,但使用 Scheme 更容易——尤其是当您进入 Y 组合器的后面材料时.
【解决方案2】:

我正在尝试通过“The Little Lisper”... 我下载了 Mit-scheme

Common Lisp 和 Scheme 是非常不同的语言。

您必须使用不同的书(例如,SICP)来匹配您的语言实现,或者使用不同的语言实现(例如,clispsbcl)来匹配您的书。

【讨论】:

  • 我确实有 SICP。我打算在完成Little Lisper后完成它。我也有小计划者,我还没有读过。我一直在囤积书籍,并在它们之间感到困惑。谢谢。
  • SICP 和 Little Lisper/Schemer 的成本和收益截然不同。在 SICP 之前通过 TLL/S 可能是一个非常好的主意。
【解决方案3】:

看看Scheme R5RS规范;它包括函数列表和句法关键字。虽然不是 Scheme 标准的一部分,但 mit-scheme 有一个函数 apropos 可以找到具有给定名称的函数(其他东西)。试试:

(apropos "atom")

(但它不会显示任何内容,:-)。

原子不是“cons cell”(一般来说,如果我记得我的 CommonLisp)。在 Scheme 中,您可以将其实现为:

(define (atom? thing) (not (pair? thing)))

注意:atom?的这个定义与CommonLisp的atom是一致的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-28
    • 2012-01-30
    • 2013-11-05
    • 1970-01-01
    • 1970-01-01
    • 2014-03-31
    • 1970-01-01
    相关资源
    最近更新 更多