Кто-нибудь, пожалуйста, скажите мне, что это ошибка в Racket (v5.1.1),
Кажется, это проблема с областью видимости.
(см. Код и вывод ниже)
Возвращение из примера-1 показывает, что x увеличивается не так, как должно и как в примере-2 и примере-3.
Функция example-2 является просто копией example-1 с удаленной инструкцией обратного вызова из doit.
Функция example-3 (как вы можете видеть) также является копией, ноимеет дополнительный параметр, который сам по себе ничего не меняет, но когда я проверяю его значение в выражении cond, он показывает x как приращенный.
Кроме того, если я ничего не возвращаю из примера-1, а скорее напечатаюто, что он теперь возвращает, показывает х как приращенный.
(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))