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

感謝您的完整的答案!我的問題的根源在於我是否可以在我的項目中使用解釋器而不必編譯。看起來我不能,但也許這還沒有確定性。我在我的例子中修復了其他錯誤。 –