2

FSI 能否很好地处理多模块/文件 F# 项目?考虑以下项目:

模块.fs:

module Xyz

let add x y = x + y

程序.fs:

module Program

open Xyz    
let result = add 1 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.fs. E.fs使用所有其他.fs文件,所以我open每个文件都有一个。如果以后我还想从任何其他文件中运行一些代码,我将不得不对#loaded之前没有的任何文件重复该过程。

根据您的建议,似乎要让我的E.fs文件在 FSI 上运行我要么必须创建一个单独的 .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 的文件中--load)。要管理更多文件,您可以编写一个脚本Load.fsx来加载您需要的所有文件。

  • 如果您有一个较大的项目(例如库)并且想要使用它或从 F# Interactive 测试它,那么您可以使用 编译库fsc.exe,从 F# Interactive 引用它并从控制台使用它的公共类型/函数

    为此,您可以使用-r:MyLib.dll命令行选项,也可以使用#r "MyLib.dllF# 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 回答
0

创建一个开头的 .fsx 文件:

#load "module.fs" "Program.fs"

并首先从 FSI 运行以加载您的代码。

于 2011-08-30T14:53:08.757 回答