将文件加载到F#';s FSI-不使用#负载

将文件加载到F#';s FSI-不使用#负载,f#,f#-interactive,f#-scripting,f#-fake,F#,F# Interactive,F# Scripting,F# Fake,我想将文件从.fsx脚本加载到F#Interactive会话中,但我不能使用#load,因为我只想在特定条件为真时加载它 是否有类似FSI.LoadFile之类的函数来代替编译器指令?查看源代码(FSI.fs,第1710行) 现在,其中一些参数可能很容易伪造-特别是sourceFiles和m。我怀疑其他参数更难伪造 我怀疑你没有试图以一种好的方式解决这个问题。另一种解决方法可能是 let conditionally_load fname cond = if cond then Syst

我想将文件从.fsx脚本加载到F#Interactive会话中,但我不能使用#load,因为我只想在特定条件为真时加载它


是否有类似FSI.LoadFile之类的函数来代替编译器指令?

查看源代码(
FSI.fs
,第1710行)

现在,其中一些参数可能很容易伪造-特别是
sourceFiles
m
。我怀疑其他参数更难伪造

我怀疑你没有试图以一种好的方式解决这个问题。另一种解决方法可能是

let conditionally_load fname cond = 
    if cond then System.IO.File.Copy(fname,"dummy.fs")
    else System.IO.File.Create("dummy.fs")
conditionally_load "something.fs" true
#load "dummy.fs"

尽管您可能需要在
#加载
之前使用
,以确保函数在
#加载
查看源代码之前运行(
fsi.fs
,第1710行)

现在,其中一些参数可能很容易伪造-特别是
sourceFiles
m
。我怀疑其他参数更难伪造

我怀疑你没有试图以一种好的方式解决这个问题。另一种解决方法可能是

let conditionally_load fname cond = 
    if cond then System.IO.File.Copy(fname,"dummy.fs")
    else System.IO.File.Create("dummy.fs")
conditionally_load "something.fs" true
#load "dummy.fs"

虽然您可能需要在
#加载
之前执行
,以确保函数在
#加载
之前运行,但您希望执行的操作很棘手,因为您希望在计算时决定是否加载其他代码。解决方法是修改shell,以便脚本加载c可以在REPL的下一次迭代中安排一个路径。本质上,您的
FSI.LoadFile
函数只需以
parsedhash指令(“load”、[“foo.fsx”]、…)
表达式的形式将路径添加到全局队列


下一次在队列中调用
ExecInteractions
方法时,可以将队列放在
actions
列表的前面。这应该可以正常工作,但显然不会得到任何intellisense支持。

您希望做的事情很棘手,因为您希望在eval时决定是否加载其他代码评估时间。解决方法是修改shell,以便在REPL的下一次迭代中安排脚本加载。本质上,
FSI.LoadFile
函数只需以
parsedhash指令(“load”、[“foo.fsx”]、…)
表达式的形式将路径添加到全局队列


下一次在队列中调用
ExecInteractions
方法时,可以将队列放在
actions
列表的前面。这应该可以正常工作,但显然不会得到任何intellisense支持。

我有一个小的后续问题:您是否看到每次在sam上使用#load时#load都会执行脚本的原因e脚本?我只想在FSI第一次看到它时执行它。@forki23-万一文件可能发生了变化?-我认为这实际上是一种明智的行为-它非常类似于CTC中的
#include
。尽管这种方法有一个很大的pb:它刷新加载类的名称,每次遇到指令时都会发生,而h使两个使用相同类的文件不兼容。这是非常糟糕的IMO@nicolas-我绝对同意这是一个坏主意-但我想不出比“事务性”行为更优雅的方法了,比如:当我们加载一个文件时,我们传递一个上下文,它将对所有顶级定义保持打开状态。等价地(?)将简单的load指令替换为延迟的、但按拓扑排序的load。我有一个小的后续问题:当我每次在同一个脚本上使用load时,你看到load执行脚本的原因了吗?我只想在FSI第一次看到它时执行它。@forki23-以防文件可能发生更改?-我认为这实际上是一个错误sible行为-它与CTC中的
#include
非常相似,但使用这种方法有一个很大的pb:它更新加载类的名称,每次遇到指令时都会发生这种情况,这使得使用相同类的两个文件不兼容。这非常糟糕IMO@nicolas-我绝对同意这是个坏主意-但我不能想一想任何更优雅的行为,比如下面的“事务性”行为不起作用:当我们加载文件时,我们传递一个上下文,该上下文将对所有顶级定义保持打开状态。等效地(?)用延迟但拓扑排序的加载替换简单的加载指令。