2015-05-06 31 views
2

我在从源代码构建的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,u唱他们的网上REPL),它的工作。当我将代码直接添加到我正在处理的文件中而无需从单独的文件中加载它时,它就可以工作。

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

+1

它适用于我。我用'csi'试了一下,然后试着用'csc'编译它。我甚至再现了你的'load'语句暗示的目录结构,看看它是否与它有关。 –

+0

真的吗?哎哟。这是否意味着我如何编辑鸡肉有什么问题? – theblacksquid

+0

我不知道。我使用Debian仓库中的CHICKEN版本。 –

回答

0

适合我。用Ubuntu上的相同版本编译Chicken,直至具体修订。

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

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

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

这使我相信,Basics.scm文件中加载是,由于某种原因,而不是一个你期待和你结束了的exponent不同,非工作版本。

你可以问鸡显示文件的内容,以确保。诸如:

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

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

+0

哇,非常感谢你这个剧本,史蒂芬,事实证明,由于某种原因,命令'(load-module)'加载了一个完全不同的命令,它也在'Basics.scm'里面,并且干扰了用应该执行的命令。评论出问题的命令解决了这个问题。 – theblacksquid

+0

唯一的问题是*为什么*一个无关的命令在调用堆栈中混淆了...... – theblacksquid

相关问题