2017-10-06 9 views
0

내 프로그램에 여러 개의 모듈이 있기를 원합니다. 예 : 모듈 foo 및 모듈 bar. 모듈 foobar 모듈을 나타냅니다. 그렇다면 나는 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 

은 내가 오류입니다 17,451,515,
$ 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 다음은 빌드 단계와 입력 파일의 요약이다 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)이 하나가 될 것이며, (prefix bar bar:)가 다른 것 도서관의 목록을 기대하고있다.

  2. R7RS 달걀이 모듈 구문에 대한 지원을 추가하는 동안

    , 그것은 계란 저장소 또는 현재 디렉토리와 같은 공유 라이브러리 및로드 가능한 위치에 가져 오기 라이브러리에 컴파일 된 모듈을 필요에 의존하는 기존의 모듈을 로딩 지원을 재사용 . 따라서 모듈을 사용하기 전에 두 모듈을 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 #chicken의 IRC 채널에서

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

    (define bork 2))) 
+0

감사 결과! 제 질문의 근본은 컴파일 할 필요없이 프로젝트의 코드에서 인터프리터를 사용할 수 있는지 여부입니다. 나는 그럴 수 없다고 생각하지만, 아직 확실하지는 않다. 나는 다른 예들을 수정했다. –