gpt4 book ai didi

visual-studio - F# 交互式 - 当多个文件引用同一个程序集时如何使用预编译器指令?

转载 作者:行者123 更新时间:2023-12-04 21:14:04 30 4
gpt4 key购买 nike

所以,在项目 AB 中,我有 FileA.fs 和 FileB.fs。 FileB 使用来自 FileA 的定义,并且 FileA 和 FileB 都使用来自 Project C(用 C# 编写)的定义。

在 FileA.FS 中,我有:

#if COMPILED
namespace ProjectAB
#else
#I "bin\debug"
#r "ProjectZ.dll"
#endif

......它应该如何工作 - 我可以在 F#-Interactive 中运行整个文件,这很棒。

在 FileB.fs 中,我的标题是:
#if COMPILED
module ProjectAB.ModuleB
#else
#load "FileA.fs"
#I "bin\debug"
#r "ProjectZ.dll"
#endif

但是当我(从 FileB)运行它时,我得到了错误:
FileA.fs(6,1): error FS0222: Files in libraries or multiple-file applications must begin with a namespace or module declaration, e.g. 'namespace SomeNamespace.SubNamespace' or 'module SomeNamespace.SomeModule'. Only the last source file of an application may omit such a declaration.

根据 fsi.exe 引用,#load 指令“读取源文件,编译并运行它”。但似乎它必须在没有定义 COMPILED 指令的情况下这样做,因为它没有看到“命名空间 ProjectAB”声明。

如何设置我的标题以便我可以在 F#-interactive 中运行任一文件?

在下面编辑 Per latkin 的回答,我创建了一个脚本作为项目中的最后一个文件 _TestScript.fsx。我从其他文件中删除了所有预编译器的内容,并将其设置为 .fsx 文件的标题:
#if INTERACTIVE
#I "bin\debug"
#r "ProjectZ.dll"
#load "FileA.fs"
#load "FileB.fs"
#endif

当我在交互式中运行它时,它会正确加载 ProjectZ、FileA 和 FileB,以便我在交互式窗口中访问。

但是,在 _TestScript.fsx 中,我得到了曲折的红线,并且对引用文件(包括“open”语句)中的任何函数/类型都没有智能感知。

我还需要在脚本文件中设置什么来使智能感知工作吗? (答案可能非常基本,因为我之前没有使用过 .fsx 文件。)

最佳答案

我不认为有办法顺利地做到这一点。有几点需要考虑:

  • INTERACTIVE始终在您被 fsi.exe 处理时定义,无论您是 .fsx、.fs、#load 'ed,随便。 COMPILED同样总是在您被 fsc.exe 处理时定义。我可以看到文档中引用的短语可能无法完全清楚地说明这一点。
  • 您只能从 #load 声明 fsi 中的命名空间'ed 文件

  • 因此,如果您希望您的文件声明一个命名空间,并在交互中作为单个文件工作,那么命名空间必须是 #ifdef出来了。但这也意味着命名空间将是 #ifdef '当文件为 #load 时退出编...

    您可以通过有条件地将其声明为模块而不是命名空间来解决此问题。或者也许创建额外的、更细化的定义。这会很棘手。

    试图让源文件作为编译库的一部分同时作为单文件脚本正常工作并不容易,而且我认为该工具的设计并未考虑到这种情况。更常见的做法是让所有库文件纯粹作为库文件,然后使用专用的独立脚本 #load s 他们需要的 .fs 文件。这使驱动代码和库代码分开,并且更干净地组合在一起。

    关于visual-studio - F# 交互式 - 当多个文件引用同一个程序集时如何使用预编译器指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28547568/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com