为什么在Scheme里面重新分配函数呢?

时间:2016-06-26 03:09:06

标签: scheme

这是来自 Simply Scheme (代码here)的代码,学生应该在我们跟随练习时加载和使用。 (注意:我是一个只为自己做这件事的人。)

(define first
  (let ((pair? pair?)
    (char->word char->word)
    (string-ref string-ref)`
    (word->string word->string)
    (car car)
    (empty? empty?)
    (whoops whoops)
    (word? word?))
    (define (word-first wd)
      (char->word (string-ref (word->string wd) 0)))
    (lambda (x)
      (cond ((pair? x) (car x))
        ((empty? x) (whoops "Invalid argument to FIRST: " x))
        ((word? x) (word-first x))
        (else (whoops "Invalid argument to FIRST: " x))))))

我非常了解letlambda在此功能中的一般用法,但我不明白为什么在let形成每个支持功能(一些自制的,一些包含电池的方案)正在重复,例如,(pair? pair?)(car car)。为什么这些在let

中被准重新分配

1 个答案:

答案 0 :(得分:5)

该代码旨在用作"库代码"在各种Scheme实现中,包括可以重新定义内置绑定的实现。 let确保原始绑定将在库函数中使用,即使用户稍后重新定义了顶级绑定。

对于您编写的非库代码,您通常不必担心这一点。此外,如果您使用带有强制不可变模块绑定(例如Racket)的模块系统的Scheme实现,那么它也不会成为一个问题。

相关问题