【问题标题】:Why reassign functions inside Scheme let?为什么要在 Scheme let 中重新分配函数?
【发布时间】:2016-06-26 03:09:06
【问题描述】:

这是来自 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表单中的每个支持函数(一些自制的,一些电池-included Scheme) 正在重复,例如,(pair? pair?)(car car)。为什么这些在let 中被准重新分配?

【问题讨论】:

    标签: scheme


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2022-09-24
      • 2013-09-22
      • 2011-06-30
      • 2015-06-19
      • 1970-01-01
      • 1970-01-01
      • 2015-08-09
      • 2021-12-09
      • 1970-01-01
      相关资源
      最近更新 更多