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

147*_*7pm 1 scheme

这是从代码简单计划(代码在这里),该学生是应该加载和使用,因为我们与练习跟着一起.(注意:我是个人,只为自己这样做.)

(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))))))
Run Code Online (Sandbox Code Playgroud)

我不够好,一起了解的一般使用letlambda在此功能,但我不明白的是为什么在let表单中每个支持功能(一些自制的,一些电池,包括计划)被重复,例如,(pair? pair?)(car car).为什么这些在这里被准重新分配let

Chr*_*ung 5

该代码被设计用作各种Scheme实现中的"库代码",包括可以重新定义内置绑定的代码.该let■确保原有绑定将库中的函数中使用,即使用户重新定义了顶级绑定以后.

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