从外部文件加载过程时出现未绑定的变量错误

时间:2015-05-06 03:40:20

标签: scheme chicken-scheme

我在使用源码构建的Cloud9托管工作区上使用Chicken Scheme 4.9.0.1。

我正在尝试使用它(我主要用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 个答案:

答案 0 :(得分:1)

对我来说很好。在Ubuntu上使用相同版本的编译鸡,直到特定版本。

您的通话记录看起来很奇怪。更具体地说:

    <eval>    [append] (reverse target)
    <syntax>          (print (exponent 5 2))

[append] (reverse target)部分看起来很奇怪。您的指数函数(如上所述)不会调用它。即使假设历史记录错误且实际上在print函数内部,我也检查了library.scm并且历史也没有意义。

这让我相信正在加载的Basics.scm文件由于某种原因而不是您期望的文件,并且您最终得到了exponent的另一个非工作版本。< / p>

您可以要求Chicken显示文件的内容以确保。例如:

(with-input-from-file "../src/Basics.scm"
  (lambda () 
    (display (read))))

结果应符合预期的内容。