Ошибка несвязанной переменной при загрузке процедуры из внешнего файла
Я использую Chicken Scheme 4.9.0.1 в рабочей среде Cloud9, созданной из исходного кода.
Я пробовал это с этим (я в основном пишу на python, поэтому я извиняюсь за странный синтаксис parens):
(define load-module
(lambda (filepath)
(begin
(load filepath)
)
)
)
(define print
(lambda (command)
(begin
(display command)
(newline)
)
)
)
(load-module "../src/Basics.scm")
(print (exponent 5 2))
где показатель был:
(define (exponent num pow)
(if (equal? pow 1)
num
(* num (exponent num (- pow 1))
)
)
)
Но это дает мне следующую ошибку:
Started /home/ubuntu/workspace/test.scm
CHICKEN
(c) 2008-2014, The Chicken Team
(c) 2000-2007, Felix L. Winkelmann
Version 4.9.0.1 (stability/4.9.0) (rev 8b3189b)
linux-unix-gnu-x86-64 [ 64bit manyargs dload ptables ]
bootstrapped 2014-06-07
; loading /home/ubuntu/workspace/project1/src/test.scm ...
; loading ../src/Basics.scm ...
Error: unbound variable: pow
Call history:
<eval> [append] (cons item (reverse target))
<eval> [append] (reverse target)
<eval> [append] (reverse (cons item (reverse target)))
<eval> [append] (cons item (reverse target))
<eval> [append] (reverse target)
<eval> [append] (reverse (cons item (reverse target)))
<eval> [append] (cons item (reverse target))
<eval> [append] (reverse target)
<eval> [append] (reverse (cons item (reverse target)))
<eval> [append] (cons item (reverse target))
<eval> [append] (reverse target)
<syntax> (print (exponent 5 2))
<syntax> (exponent 5 2)
<eval> (print (exponent 5 2))
<eval> (exponent 5 2)
<eval> [exponent] (equal? pow 1) <--
Я попробовал ту же процедуру на другой схеме реализации (biwascheme, используя их онлайн REPL), и это сработало. Когда я добавил код непосредственно в файл, над которым я работал, не загружая его из отдельного файла, он работал.
Почему выдается ошибка несвязанной переменной только при загрузке из отдельного файла?
1 ответ
У меня отлично работает. Скомпилированный Цыпленок с той же версией на Ubuntu, вплоть до конкретной ревизии.
Ваша история звонков выглядит очень странно. Более конкретно:
<eval> [append] (reverse target)
<syntax> (print (exponent 5 2))
[append] (reverse target)
часть выглядит странно. Ваша функция экспоненты (как описано) не вызывает это. Даже если предположить, что история была неправильной, и это было на самом деле внутри print
функция, я проверил library.scm
и эта история тоже не имеет смысла.
Это заставляет меня верить, что Basics.scm
по какой-то причине загружаемый файл не тот, который вы ожидаете, и в результате вы получили другую, нерабочую версию exponent
,
Вы можете попросить Chicken показать содержимое файла, чтобы убедиться. Нечто такое как:
(with-input-from-file "../src/Basics.scm"
(lambda ()
(display (read))))
Результат должен соответствовать ожидаемому контенту.