2017-10-06 13 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

Kooda推奨#chicken IRCチャンネルから:ここでは、ビルド手順や入力ファイルの要約です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 
2

これでいくつかの問題があります:

barモジュールをロードするための構文が間違っている
  1. import(scheme base)が1になると(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

感謝を結果です!私の質問の根源は、コンパイルせずにプロジェクトのコード上でインタプリタを使用できるかどうかということです。それは私ができないように見えるが、それはまだ決定的ではないかもしれない。私は私の例で他のエラーを修正しました。 –