【问题标题】:Unbound variable error when loading a procedure from an external file从外部文件加载过程时出现未绑定变量错误
【发布时间】:2015-05-06 03:40:20
【问题描述】:

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

我正在尝试使用这个(我主要使用 python 编写代码,所以我为奇怪的括号语法道歉):

(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)上尝试了相同的过程,并且成功了。当我将代码直接添加到我正在处理的文件中而不从单独的文件中加载它时,它就可以工作了。

为什么只有从单独的文件加载时才会给出未绑定变量错误?

【问题讨论】:

  • 它对我来说很好用。我用csi 尝试了它,然后尝试用csc 编译它。我什至复制了您的 load 声明所暗示的目录结构,看看是否与它有关。
  • 真的吗?哎哟。这是否意味着我编译 CHICKEN 的方式有问题?
  • 我不知道。我使用了 Debian 存储库中的 CHICKEN 构建。

标签: scheme chicken-scheme


【解决方案1】:

对我来说很好用。在 Ubuntu 上编译相同版本的 Chicken,一直到具体的修订版本。

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

    <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))))

结果应该与预期的内容相匹配。

【讨论】:

  • 哇,非常感谢你的脚本,斯蒂芬,事实证明,由于某种原因,命令 (load-module) 正在加载一个完全不同的命令,该命令也在 Basics.scm 中,并且是干扰应该执行的命令。注释掉有问题的命令解决了这个问题。
  • 唯一的问题是为什么一个不相关的命令会这样混在调用堆栈中......
  • 我也遇到了这个问题。我不确定是什么原因。如果我删除 foreign-declare 问题就消失了。我对 foreign-lambda 也有同样的看法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多