2016-06-30 6 views
1

私はmy-mod.rktと呼ばれる次のファイルがあるとしましょう。1つのRacketプログラムでモジュールを何回もインスタンス化できますか?

#lang racket ;; my-mod.rkt 
(displayln "Module ran") 

私は明らかにREPLまたは別のスクリプトでモジュールをインスタンス化することによって、このファイルを実行することができます

(require "my-mod.rkt") 

Module ranを出力します。

しかし、この方法でモジュールを2回実行できない場合は、例えば、私は二回my-mod.rktが必要な場合:

(require "my-mod.rkt") 
(require "my-mod.rkt") 

モジュールは、一度だけインスタンス化されます。これは通常あなたが必要とする目的のために必要なものですが、この場合、モジュールをインスタンス化することは私が保存したい副作用があります。

もちろん、私は別のサブプロセスでこれを実行するためにfind-exeを使用することができます。

(require compiler/find-exe) 
(system* (find-exe) "my-mod.rkt") 

をしかし、私は私が何をしたいのかされていない、別のOSレベルのプロセスでこのプログラムを実行していますよ。

だから、私は同じラケットプログラムで二回モジュールをインスタンス化することができますか?

答えて

0

はい、同じプログラムでラケットモジュールを2回インスタンス化できます。 current-namespaceを変更し、namespace-requireを使用してこれを行うことができます。

#lang racket 
(define ns (current-namespace)) 
(parameterize ([current-namespace (make-base-namespace)]) 
    (namespace-require "my-mod.rkt")) 

(parameterize ([current-namespace (make-base-namespace)]) 
    (namespace-require "my-mod.rkt")) 

そして、このプログラムは二回Module ranを出力します実行している:あなたは2でこれをやっている

Module ran 
Module ran 

次のプログラムは、例えば、二回my-mod.rktモジュールが必要になりますモジュールからインポートされたものは、どちらの場合も異なるでしょう。 namespace-attach-moduleを使用してモジュールをある名前空間から別の名前空間に移動する場合は、この問題が発生する可能性が最も高くなります。

また、current-namespaceを使用して名前空間を変更しているため、現在のモジュールで宣言しているサブモジュールは表示されなくなります。これは、my-mod.rktが別のファイルにあるためにのみ機能します。サブファイルの場合、これはできません。

関連する問題