在尝试评估引用的嵌套函数define时,scheme r5rs undefined error

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

似乎如果我想使用eval在一个环境中定义一个嵌套函数,并且如果在返回之前只有sub defines,那么我以前定义的内容不能被后来的defines引用(导致未定义的错误)。

但是如果我在sub defines之间添加一些无意义的代码,我可以顺利运行代码。

我不知道这是对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
scheme racket eval r5rs
1个回答
0
投票

根据docs,内部定义可能发生在lambda的开头,只要这是真的(强调我的):

必须有可能在<body>中评估每个内部定义,而无需指定或引用任何定义的<variable>的值。

所以你要做的就是开始无效。令我困惑的是为什么它在defines之前插入表达式时起作用。值得一提的是,通过这样做,您可以获得相同的行为而没有错误:

#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
© www.soinside.com 2019 - 2024. All rights reserved.