解释多个模块

时间:2017-10-06 15:13:46

标签: chicken-scheme

我想在我的程序中有多个模块。例如。模块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 个答案:

答案 0 :(得分:3)

有一些问题:

  1. 加载bar模块的语法错误,import需要一个库列表,其中(scheme base)为1,(prefix bar bar:)为另一个。{1}}。

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

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

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

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

答案 1 :(得分:2)

来自#chicken irc频道的Kooda推荐了system egg,它似乎在做我正在寻找的东西。简而言之,需要创建一个指定依赖关系树的.system文件,如下所述。有点不幸的是,Chicken Scheme无法通过查看每个模块中的import语句来找出内部模块依赖关系,但我认为这是下一个最好的事情。

$ 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