F# FSI和装载顺序

F# FSI和装载顺序,f#,f#-interactive,fsi,F#,F# Interactive,Fsi,在a.fsx中: namespace na module ma = let var = 2 在b.fsx中: #load "a.fsx" namespace nb module mb = let var = na.ma.var 在c.fsx中: #load "a.fsx" namespace nc module mc = let var = na.ma.var 在userdep.fsx中: #load "b.fsx" #load "c.fsx" 在user

在a.fsx中:

namespace na 
module ma = 
    let var = 2
在b.fsx中:

#load "a.fsx"
namespace nb
module mb = 
    let var = na.ma.var
在c.fsx中:

#load "a.fsx"
namespace nc
module mc = 
    let var = na.ma.var
在userdep.fsx中:

#load "b.fsx"
#load "c.fsx"
在user.fsx中:

#load "userdep.fsx"
现在,如果我将user.fsx中的最后一条指令发送给FSI,我会得到:

> 
[Loading \\psf\home\Documents\Visual Studio 11\Projects\Library3\Library3\b.fsx
 Loading \\psf\home\Documents\Visual Studio 11\Projects\Library3\Library3\a.fsx
 Loading \\psf\home\Documents\Visual Studio 11\Projects\Library3\Library3\c.fsx
 Loading \\psf\home\Documents\Visual Studio 11\Projects\Library3\Library3\userdep.fsx]


b.fsx(6,15): error FS0039: The namespace or module 'na' is not defined
> 
如果确定的加载顺序是显示的加载顺序,则这是有意义的。 如果我从userdep.fsx发送两行代码,那么我必须引用不同名称空间中的:

> 
[Loading \\psf\home\Documents\Visual Studio 11\Projects\Library3\Library3\a.fsx
 Loading \\psf\home\Documents\Visual Studio 11\Projects\Library3\Library3\b.fsx]

namespace FSI_0002.na
  val var : int


namespace FSI_0002.nb
  val var : int

[Loading \\psf\home\Documents\Visual Studio 11\Projects\Library3\Library3\a.fsx
 Loading \\psf\home\Documents\Visual Studio 11\Projects\Library3\Library3\c.fsx]

namespace FSI_0003.na
  val var : int


namespace FSI_0003.nc
  val var : int

> 

有什么原则可以避免你意识到的那种行为吗?

这不是你应该做的事情。您应该有模块文件(
.fs
文件)和一个脚本文件,该文件按正确顺序加载所有模块文件。脚本文件应该很少加载其他脚本文件。这是一个很好的指导。我正在寻找一种可组合的方式,让独立脚本访问a、b和c中的函数性。如果没有一些编译步骤来解决加载顺序并使其特定于每个功能组合,那么我不确定这是否可能。如果你真的无法重新设计你的目标,那么我建议编写一个元脚本来查看较小的脚本(作为文本文件),查找
#load
行以建立依赖关系,然后创建不带
#load
行的新文件,按正确顺序加载,并删除临时文件。应该是几乎微不足道的(一个注意事项,是多行注释和字符串),但一开始可能看起来不美观。整个想法将是有一个开放的脚本系统。也就是说,假tak,但作为脚本。这样,无需编译,与git同步,易于贡献。我应该看看FSI代码,看看它为什么/如何做到这一点。