我想foo
使用一个辅助函数来定义一个常量,比如bar
. 我想隐藏bar
在 的定义中foo
,所以我提供了以下代码:
(define foo
(define (bar n)
(+ n n))
(bar 1))
然而,这个定义在许多方案实现(mit-scheme、racket、guile 等)中会导致语法错误。
我有三种解决方法,但似乎都不令人满意:
(define foo1
((lambda ()
(define (bar n)
(+ n n))
(bar 1))))
(define foo2
(let ((bar (lambda (n) (+ n n))))
(bar 1)))
(define (foo3)
(define (bar n)
(+ n n))
(bar 1))
foo1
使用 lambda 来创建编写辅助定义的环境,括号似乎有点令人困惑。
foo2
使用 let 表达式,但我不能再使用语法糖(define (f n) ...)
=>(define f (lambda (n) ...))
foo3
与原始值相比,需要较少的修改,但每次我想要这个值时,我都必须重新调用(foo3)
并重新计算。
我的问题是:
- 我认为这种嵌套定义是有道理的,但为什么会被认为是语法错误呢?
- 有什么体面的方法来写 的定义
foo
吗?