2

FSIはマルチモジュール/ファイルF#プロジェクトをうまく処理しますか?次のプロジェクトについて考えてみます。

module.fs:

module Xyz

let add x y = x + y

Program.fs:

module Program

open Xyz    
let result = add 1 2

の最後の2行を選択して実行するとProgram.fs、次のFSIエラーが発生します。

Program.fs: error FS0039: The namespace or module 'Xyz' is not defined

ここでの問題は何ですか?


それで、私が次のプロジェクト構造を持っているとしましょう:

A.fs
B.fs
C.fs
D.fs
E.fs

のいくつかの関数を実行したいE.fsE.fs他のすべての.fsファイルを利用するのでopen、それぞれに1つずつあります。後で他のファイルのいずれかからコードを実行したい場合は、#loaded以前になかったファイルに対してプロセスを繰り返す必要があります。

あなたの提案から、私のファイルをFSIで実行するように思わE.fsれます。別の.fsxファイルを作成するか、別の.fsxファイルを作成する必要があります。

#if INTERACTIVE
#load "..."

使用するモジュールごとに、IMOはかなり冗長です。私はここで何かが欠けていますか、それともこれはKISSとDRYの両方の原則の明らかな違反ですか?

4

4 に答える 4

4

ファイルをロードしていないため、エラーが発生します-私にとっては問題なく動作します

 $ fsi --load:module.fs --load:Program.fs

Microsoft (R) F# 2.0 Interactive build 2.0.0.0
Copyright (c) Microsoft Corporation. All Rights Reserved.

For help type #help;;

[Loading /suphys/jpal8929/fsbug/module.fs
 Loading /suphys/jpal8929/fsbug/Program.fs]

namespace FSI_0002
  val add : int -> int -> int


namespace FSI_0002
  val result : int

> 
于 2011-08-30T06:54:41.967 に答える
3

いくつかのオプションがあり、そのうちのいくつかは Brian と jpalmer によって既に言及されているので、要約してみます。

  • ファイルが数個しかない場合は、それらを「ロード」できます。つまり、ソースが F# Interactive に送信され、FSI コンソールでコンパイルされます。このアプローチは、大規模なプロジェクトの一部をテストする場合に役立ちます。

    これを行うには、--load:file.fsコマンド ライン オプションを使用するか#load "file.fs"、F# Interactive (または をScript.fsx使用して F# Interactive に送信されるファイル) に書き込むことができます--loadLoad.fsxより多くのファイルを管理するために、必要なすべてのファイルをロードするスクリプトを作成できます。

  • 大規模なプロジェクト (ライブラリなど) があり、F# Interactive から使用またはテストする場合は、 を使用してライブラリをコンパイルし、fsc.exeF# Interactive から参照して、コンソールからそのパブリック型/関数を使用できます。

    これを行うには、-r:MyLib.dllコマンド ライン オプションを使用するか#r "MyLib.dll、F# Interactive (またはfsxスクリプト ファイル) で記述します。

于 2011-08-30T10:55:53.630 に答える
2

知ってい#loadますか?#r(他のコードをDLLにコンパイルした後) 知っていますか?http://msdn.microsoft.com/en-us/library/dd233175.aspx

于 2011-08-30T09:48:03.763 に答える