1

次のコードに「Hello、world!」と表示されるrnrs-modifiedというライブラリを作成するにはどうすればよいですか...?

#!r6rs
(import (rnrs-modified))
(display set!)

またはこれでさえ良いでしょう(実際にはおそらくもっと良いです):

#!r6rs
(import (rnrs) (modified)) ;or (import (modified) (rnrs))
(display set!)

基本的に、ライブラリ内の構文キーワード(let、lambda、set!など)を再定義し、そのライブラリを別のライブラリまたはトップレベルプログラムにインポートして、それらの再定義されたキーワードを使用できるようにしたいと考えています。

しかし、私はこれを取得し続けます:

module: identifier already imported from a different source in:
  set!
  (lib "rnrs/main.ss")
  (lib "rnrs-modified/main.ss")

rnrs-modifiedに使用しているコードは次のとおりです。

#!r6rs
(library (rnrs-modified)
         (export (rename (f set!)))
         (import (rnrs))
         (define f "Hello, world!"))

何か案は?


更新:これは「mzschemeモジュール」で見つかりまし。これはr6rsスキーム用ではありませんが、それが提供する機能は基本的に私が探しているものです。provide all-from-exceptr6rsスキームでどのようにできますか?

4

1 に答える 1

2

R6RSは、カスタマイズするライブラリを特定し、カスタマイズするパーツを除外して、それらのパーツを独自のライブラリで定義することにより、目標の達成に役立ちます。次に例を示します。

myrnrs.sls

(library
 (myrnrs)

 (export set!)

 (import
  (except (rnrs) set!)
  (rename (rnrs) (set! rnrs-set!)))

 (define set! "Hello, world."))

test.scm

(import
 (except (rnrs) set!)
 (myrnrs))
 (display set!)(newline)    

残念ながら、Racketにあるようなものを除いて、all-from-のようなものはありません。したがって、set!を再定義するライブラリを作成できますが、rnrsをインポートしてから、set!の再定義に加えて、これらすべてのバインディングのエクスポートを入力する必要があります。あなたはここでもっと読む; 皮肉なことに、私もセットなしでライブラリを作成したかったのです!

于 2010-07-22T18:35:16.520 に答える