2012-04-18 4 views
4

+ reload fsxファイルをロードするにはどうすればよいでしょうか?ただ、私は次のFSIで行うことができる方法が大好きです。..電気ショック療法電気ショック療法F# 'モジュール化されたスクリプト'

を...はいはい右の言語正しい仕事を試し:

#load "script.fsx"; 
open Script 

> let p = script.x 1 
    Error: This expression was expected to have type string but here has int... 
(* edit script.fsx x to make it int -> int *) 
> 
> #load "script.fsx" 
> let p = script.x 1 
val it : int = 2 

しかし、私たちは私たちが実行しているアプリケーションのためにこれをどのように行うのですかvia fsi blah.fsx?たぶん、あるループの中に座っている何か。 #loadと#useはletまたはmoduleの内部にあってはいけません。つまり、#loadスクリプトを使用することはできません。

私のオリジナルの方法は、何かを追加/修正するたびに.fsファイルを作成し、再コンパイルして再起動することでした。このメソッドはプリミティブを感じます。

第2の方法は、(一種のスコープという点で意味があります)動作しないことが判明した、モジュールの内部で#loadディレクティブを使用しようとした...

module test1 = 
    #load @"C:\users\pc\Desktop\test.fsx" 

    open Test 

module test2 = 
    ... 

もう一つの方法は次のようになりますfsi module.fsxにプロセス診断プログラムをロードすることで、すべてのモジュールの新しいプロセスを作成できますが、これは恐ろしく非効率的で厄介です。

これは.NETの中では些細なことではないと私は心から深く感じていますが、とにかく質問をしたいと思います.FSIはそれを行います...私はFSI APIなどをまたは少なくともコードをコピーするには)?

TL; DR私はerlangについて次のように読んで、F#で自分自身でそれをしたいと思っています。 Erlang: Is there a way to reload changed modules into an already running node with rebar?

"...プログラム内のモジュールがディスク上で変更されると、いつでもリローダは実行中のコピーを自動的に置き換えます。"

+3

ソリューションがあるかもしれません - 'fsiDynamicCompiler.EvalLoadFiles'を使用して - これは何'#のload'コールです。参考までに、https://github.com/fsharp/fsharp/blob/master/src/fsharp/fsi/fsi.fsの1690行にある –

+0

を参照してください。いい考えです。私はfsi.fsについて簡単に見ましたが、私は純粋なコード量私はこれをもう一度見ていきます。 –

+0

私はあなたの質問に答えられたという誤った印象を人々に与えるかもしれないので、私の答えのDavidを削除します。 :-) –

答えて

0

これはFSで動作するかどうかわかりませんが、MLでは、プロジェクト内のすべてのファイルを読み込んだマスターファイルをロードしてから、一緒に編むために必要なコードを実行してアプリケーションを実行できます。 REPLの内部から実行される大規模なアプリケーションの例を見るには、ケンブリッジ計算科学研究所のIsabelle/HOLサイトhttp://www.cl.cam.ac.uk/research/hvg/Isabelle/installation.htmlのサイトをご覧ください。アプリをダウンロードした後、srcコードディレクトリにroot.mlというファイルがあるかどうかを調べます。さまざまなレベルの実装を制御する数多くのものがあります。トップレベルのファイルは、その特定のサブ機能をロードする複数のサブディレクトリ内のファイルを呼び出すことができるため、これは再帰的です。これにより、どのトップレベルファイルが実行されるかに応じて、アプリケーションをさまざまなシナリオにターゲット設定することができます。

0

一般的な.NET Frameworkアプリケーションは、アプリケーションで起動するプライマリドメインとは別のアプリケーションドメインに属していない限り、アセンブリをアンロード/リロードできません。これは基本的に、ほとんどのプラグインシステムが完全な.NET Frameworkで動作するアプリケーション用に設計されている方法です。 Collectible Assemblies機能を備えた.NETの.NET 2.0以降では、状況が変化する可能性があります。

参考文献:

関連する問題