为什么 TSPL 的 letrec 示例可以在 ChezScheme 中仅使用 let 运行?

问题描述 投票:0回答:1

TSPL 3.2中我们发现:

(letrec ((even?
          (lambda (x)
            (or (= x 0)
                (odd? (- x 1)))))
         (odd?
          (lambda (x)
            (and (not (= x 0))
                 (even? (- x 1))))))

;; (list (even? 20) (odd? 20))) => (#t #f)

但是同一个程序,如果用

let
代替
letrec
,仍然可以在ChezScheme中运行:

(let    ((even?
          (lambda (x)
            (or (= x 0)
                (odd? (- x 1)))))
         (odd?
          (lambda (x)
            (and (not (= x 0))
                 (even? (- x 1))))))

这是 Chez 的错误吗? TSPL不会错的。谢谢!

scope scheme let letrec
1个回答
1
投票

内置的方案功能

even?
odd?
let
版本中被调用。使用不同的名称,你会得到一个错误:

(let ([my-even?
       (lambda (x)
         (or (= x 0)
             (my-odd? (- x 1))))]
      [my-odd?
       (lambda (x)
         (and (not (= x 0))
              (my-even? (- x 1))))])
  (list (my-even? 20) (my-odd? 20)))

会失败。将其更改为

letrec
它会起作用,因为您的函数将在其定义的主体范围内。

© www.soinside.com 2019 - 2024. All rights reserved.