Ошибка несвязанной переменной при загрузке процедуры из внешнего файла

Я использую 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))))

Результат должен соответствовать ожидаемому контенту.

Другие вопросы по тегам