有人请告诉我这是 Racket (v5.1.1) 中的错误,
这似乎是一个范围界定问题。
(请参阅下面的代码和输出)
示例 1 的返回显示 x 不是 按应有的方式增加 在示例 2 和示例 3 中。
函数 example-2 只是 example-1 的副本 从 doit 中删除反向指令。
函数 example-3 (如您所见)是一个副本 也一样,但有一个附加参数,它本身 不会改变任何东西,但是当我测试它的值时 cond 语句显示 x 正在递增。
此外,如果我没有从 example-1 返回任何内容 而是打印它现在返回的内容,它将 x 显示为 正在递增。
(define (example-1 lst)
(letrec([x 0]
[doit (lambda ()
(reverse
(foldl
(lambda (v store)
(set! x (add1 x))
(cons v store))
'()
lst)))])
(let*([results (doit)])
(list x results)
)))
(define (example-2 lst)
(letrec([x 0]
[doit (lambda ()
(foldl
(lambda (v store)
(set! x (add1 x))
(cons v store))
'()
lst))])
(let*([results (doit)])
(list x results))))
(define (example-3 lst id)
(letrec([x 0]
[doit (lambda ()
(reverse
(foldl
(lambda (v store)
(set! x (add1 x))
(cons v store))
'()
lst)))])
(let*([results (doit)])
(cond [(= 1 id) 'junk])
(list x results)
)))
(printf "example-1 : ~a~n" (example-1 '(a b c)))
(printf "example-2 : ~a~n" (example-2 '(a b c)))
(printf "example-3 : ~a~n" (example-3 '(a b c) 1))
输出:
example-1 : (0 (a b c))
example-2 : (3 (c b a))
example-3 : (3 (a b c))
最佳答案
这是一个错误 -- I filed it使用更简单的代码版本。 (不过,这与 jit 无关。)
编辑:错误是 fixed现在。
关于racket - Racket v5.1.1 中的范围界定错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6399999/