似乎如果我想使用eval
在一个环境中定义一个嵌套函数,并且如果在返回之前只有sub define
s,那么我以前定义的内容不能被后来的define
s引用(导致未定义的错误)。
但是如果我在sub define
s之间添加一些无意义的代码,我可以顺利运行代码。
我不知道这是对eval
或其他什么的错误使用,但行为似乎很奇怪......任何人都可以帮忙吗?
#lang racket
(require r5rs)
(define env (scheme-report-environment 5))
(eval '(define (f)
;comment the next line to cause error
0 ; or anything except define
(define x 3)
(define y (+ x 1))
y) env)
(eval '(f) env)
错误信息:
x: undefined;
cannot use before initialization
根据docs,内部定义可能发生在lambda
的开头,只要这是真的(强调我的):
必须有可能在
<body>
中评估每个内部定义,而无需指定或引用任何定义的<variable>
的值。
所以你要做的就是开始无效。令我困惑的是为什么它在define
s之前插入表达式时起作用。值得一提的是,通过这样做,您可以获得相同的行为而没有错误:
#lang racket
(require r5rs)
(define env (scheme-report-environment 5))
(eval '(define (f)
(let* ((x 3)
(y (+ x 1)))
y))
env)
(eval '(f) env)
=> 4
另请注意,使用标准Racket时,行为与您期望的一样:
#lang racket
(define-namespace-anchor a)
(define ns (namespace-anchor->namespace a))
(eval '(define (f)
(define x 3)
(define y (+ x 1))
y)
ns)
(eval '(f) ns)
=> 4