【问题标题】:What is the equivalent of the rest procedure in SICP in MIT Scheme 9.2?麻省理工学院方案 9.2 中 SICP 中的休息程序相当于什么?
【发布时间】:2016-05-30 01:06:38
【问题描述】:

我正在练习 2.32,它提供以下代码:

(define (subsets s)
  (if (null? s)
      (list nil)
      (let ((rest (subsets (cdr s))))
        (append rest (map <??> rest)))))

当我尝试在 MIT Scheme 9.2 中调用 rest 过程时,它无法识别该过程(书中的 nil 存在类似问题,在现代 Scheme 中被 () 取代)。现代Scheme中等效的rest过程是什么?我不相信是cdr,因为整本书都使用了cdr

【问题讨论】:

  • 您提供的代码中没有rest 过程。
  • 注意:在旧的 Scheme 代码中,与对相关的运算符是:conscarcdr。由于可以使用cons 来构建除列表之外的其他数据结构,因此无法确定(cdr xs) 是一个列表——除非检查上下文。为了表明正在处理列表,有些人使用函数firstrest 而不是carcdr。这个想法是人们知道(rest xs) 是一个列表——不管上下文是什么。最后:SICP 是在大会召开前几年编写的,因此 SICP 作者使用carcdr

标签: scheme lisp sicp mit-scheme


【解决方案1】:

你误解了这个练习 - rest 不是一个过程,是一个对应于子集 rest 的局部变量(也许你应该看看 documentation 关于let)。这就是这本书的要求:

(define (subsets set)
  (if (null? set)
      (list '())
      (let ((rest (subsets (cdr set))))
        (append rest
                (map (lambda (sets) (cons (car set) sets))
                     rest)))))

【讨论】:

  • facepalm...谢谢。这本书还没有涵盖太多,我想我还没有记住它。
【解决方案2】:

正如@tfb 指出的那样,这段代码中的rest 不是一个过程,它是一个本地绑定的符号。

也许您误解了有关rest 的错误消息;没有看到,很难说。

【讨论】:

    猜你喜欢
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多