2017-10-06 76 views
0

我想在我的程序中有多个模块。例如。模块foo和模块bar。模块foo将参考模块bar。然后我希望能够在csi(解释)repl中测试这些模块。这个问题的根源在于如果我可以运行我的代码而不必编译它。以下是我的例子。解释多个模块

注:我是一个计划新手,所以这个代码可能有其他问题。随意指出任何事情,我会尽力纠正。

foo.scm

(use r7rs) 
(define-library (foo) 
    (import (scheme base) 
      (prefix bar bar:)) 
    (export add-some-stuff) 
    (begin 

    (define baz 1) 

    (define (add-some-stuff) 
     (+ baz bar:bork)) 

    )) 

bar.scm

(use r7rs) 
(define-library (bar) 
    (import (scheme base)) 
    (export bork) 
    (begin 

    (define bork 2))) 

结果更希望成为:

$ csi 
> ,l foo.scm 
> (import (prefix foo foo:)) 
> (foo:add-some-stuff) 
;;=> 3 

这是我得到的错误:

$ csi -q 
#;1> ,l foo.scm 
; loading foo.scm ... 
; loading /usr/local/Cellar/chicken/4.12.0/lib/chicken/8/r7rs.import.so ... 
; loading /usr/local/Cellar/chicken/4.12.0/lib/chicken/8/chicken.import.so ... 
; loading /usr/local/Cellar/chicken/4.12.0/lib/chicken/8/numbers.import.so ... 
; loading /usr/local/Cellar/chicken/4.12.0/lib/chicken/8/foreign.import.so ... 
; loading /usr/local/Cellar/chicken/4.12.0/lib/chicken/8/srfi-4.import.so ... 
; loading /usr/local/Cellar/chicken/4.12.0/lib/chicken/8/scheme.base.import.so ... 
; loading /usr/local/Cellar/chicken/4.12.0/lib/chicken/8/r7rs-support.import.so ... 
; loading /usr/local/Cellar/chicken/4.12.0/lib/chicken/8/extras.import.so ... 
; loading /usr/local/Cellar/chicken/4.12.0/lib/chicken/8/srfi-13.import.so ... 
; loading /usr/local/Cellar/chicken/4.12.0/lib/chicken/8/r7rs-compile-time.so ... 
; loading /usr/local/Cellar/chicken/4.12.0/lib/chicken/8/r7rs-library.so ... 
; loading /usr/local/Cellar/chicken/4.12.0/lib/chicken/8/r7rs-support.so ... 

Note: re-importing already imported syntax: syntax-rules 

Note: re-importing already imported syntax: cond-expand 

Note: re-importing already imported syntax: define-record-type 

Note: re-importing already imported syntax: include 

Note: re-importing already imported syntax: include 

Note: re-importing already imported syntax: import 

Note: re-importing already imported syntax: import-for-syntax 

Note: re-importing already imported syntax: cond-expand 

Note: re-importing already imported syntax: import-for-syntax 

Note: re-importing already imported syntax: import 
; loading /usr/local/Cellar/chicken/4.12.0/lib/chicken/8/r7rs.so ... 
; loading /usr/local/Cellar/chicken/4.12.0/lib/chicken/8/numbers.so ... 
; loading /usr/local/Cellar/chicken/4.12.0/lib/chicken/8/scheme.base.so ... 

Note: re-importing already imported syntax: syntax-rules 

Note: re-importing already imported syntax: import-for-syntax 

Note: re-importing already imported syntax: import 

Note: re-importing already imported syntax: cond-expand 

Note: re-importing already imported syntax: import-for-syntax 

Note: re-importing already imported syntax: import 

Error: (import) during expansion of (import ...) - cannot import from undefined module: bar 

    Call history: 

    numbers.scm:1672: scan-real 
    <syntax>  (define-library (foo) (import (scheme base) (prefix bar bar:)) (export add-some-stuff) (begin (defin... 
    <syntax>  (##core#module foo ((##r7rs#foo)) (##core#define-syntax ##r7rs#foo (##core#lambda _ (quote (##core#u... 
    <syntax>  (##core#define-syntax ##r7rs#foo (##core#lambda _ (quote (##core#undefined)))) 
    <syntax>  (##core#lambda _ (quote (##core#undefined))) 
    <syntax>  (##core#begin (##core#quote (##core#undefined))) 
    <syntax>  (##core#quote (##core#undefined)) 
    <syntax>  (##core#undefined) 
    <syntax>  (##sys#provide (##core#quote foo)) 
    <syntax>  (##core#quote foo) 
    <syntax>  (import-for-syntax (only r7rs begin cond-expand export import import-for-syntax include include-ci s... 
    <syntax>  (##core#undefined) 
    <syntax>  (import (only r7rs begin cond-expand export import import-for-syntax include include-ci syntax-rules... 
    <syntax>  (##core#undefined) 
    <syntax>  (##core#begin (import (scheme base) (prefix bar bar:)) (##core#begin (export add-some-stuff) (##core... 
    <syntax>  (import (scheme base) (prefix bar bar:)) <-- 
#;1> 

回答

2

从#chicken IRC频道Kooda system egg,它似乎在做我在找的东西。总之,需要创建一个.system文件来指定依赖关系树,如下所述。有点不幸的是,Chicken Scheme不能从每个模块中的导入语句中找出内部模块的依赖关系,但我认为这是次好的事情。

$ chicken-install system 

创建一个名为so-question-chicken-scheme.system的文件。该文件应包含以下内容:

(define-system so-question-chicken-scheme 
    (scheme-file "bar") 
    (scheme-file "foo" depends: '("bar"))) 

这里的翻译结果

$ csi -q 
#;1> (use system) 
#;2> (load "so-question-chicken-scheme.system") 
#;3> (load-system so-question-chicken-scheme) 
#;4> (import (prefix foo foo:)) 
#;5> foo:add-some-stuff 
#<procedure (add-some-stuff)> 
#;6> (foo:add-some-stuff) 
3 
2

有一些问题与此:

  1. 用于加载bar模块的语法是错误的,import预计库,其中(scheme base)将是一个和(prefix bar bar:)将是另一个列表。

  2. 虽然R7RS egg增加了对其模块语法的支持,但它重用了现有的模块加载支持,该支持依赖于将模块编译到共享库和导入库的可加载位置,如egg存储库或当前目录。因此,您必须在使用前以csc -R r7rs -sJ的正确顺序编译这两个模块。

  3. csc -R r7rs -sJ bar.scm成功,csc -R r7rs -sJ foo.scm没有。这是因为前面的调用由于(define-library (other-module) ...)而发出other-module.import.scm。这需要进行更改以匹配您导入的标识符。

通过这些更改,我可以成功地重现您的示例会话。下面是构建步骤和输入文件的摘要:推荐

csc -R r7rs -sJ bar.scm 
csc -R r7rs -sJ foo.scm 

foo.scm

(use r7rs) 
(define-library (foo) 
    (import (scheme base) 
      (prefix bar bar:)) 
    (export add-some-stuff) 
    (begin 

    (define baz 1) 

    (define (add-some-stuff) 
     (+ baz bar:bork)) 

    )) 

bar.scm

(use r7rs) 
(define-library (bar) 
(import (scheme base)) 
(export bork) 
(begin 

    (define bork 2))) 
+0

感谢您的完整的答案!我的问题的根源在于我是否可以在我的项目中使用解释器而不必编译。看起来我不能,但也许这还没有确定性。我在我的例子中修复了其他错误。 –