在Scheme中“lambda”体内放置“define”

时间:2015-03-09 20:50:34

标签: lambda scheme

是否有人知道限制define表单只出现在lambda正文开头的理由(即不允许在除define以外的任何形式之后使用它们)?对我来说,它似乎很随意,并且排除了编写更优雅的代码。特别是在任何地方允许define似乎消除了对let - 相关表单的需求,从而使代码更易于阅读。另一个好处是(define x)等形式的消失(没有指定任何值),只需要稍后的set!,从而将声明和初始化结合在一起。

2 个答案:

答案 0 :(得分:0)

没有理由说明实施无法支持这一点。例如。

(define (fib x)
  (define (fin-aux n a b)
    (if (other-fun n)
        a
        (fib-aux (- n 1) b (+ a b))
  (fib-aux x 0 1)
  (define (other-fun x)
    (zero? x)))

; transforms into ==>
(define (fib x)
  (letrec* ((fib-aux (lambda (n a b) ..))
            (other-fun (lambda (x) ...)))
    (fib-aux x 0 1)))

这是一个简单的程序。想象一下有10多个定义。它就像Where's Wally?的Scheme版本。

当我在90年代学习Java时,我被告知将所有变量放在课程的最底层,因为它使教授的代码更清晰。我今天没有这样做,但这个问题让我想到了阅读那些引用我尚未定义的类变量的代码是多么困难。如果表达式的位置是一个品味问题,那么可能更难以阅读Scheme。

答案 1 :(得分:-1)

Guile 3.0 放宽了在开头放置内部定义的限制。