4

加载+重新加载 fsx 文件的推荐方法是什么?只是试验......是的,是的,正确的语言,正确的工作等等。

我喜欢如何在 FSI 中完成以下工作:

#load "script.fsx";
open Script

> let p = script.x 1 
  Error: This expression was expected to have type string but here has int...
(* edit script.fsx x to make it int -> int  *)
>
> #load "script.fsx"
> let p = script.x 1
val it : int = 2

但是我们如何为通过 fsi blah.fsx 运行的应用程序执行此操作?也许是坐在一个while循环中的东西。似乎#load 和#use 不能在let 或module 中。即你不能像let reload script = #load script 那样使用#load,想知道为什么?

我最初的方法是拥有 .fs 文件并在每次我想添加/修复某些内容时重新编译 + 重新启动。这种方法感觉很原始。

第二种方法是尝试在模块内使用 #load 指令,结果证明它不起作用(就范围而言有点意义)......

module test1 =
  #load @"C:\users\pc\Desktop\test.fsx"

  open Test

module test2 = 
  ...

另一种方法是通过加载带有进程诊断的 fsi module.fsx 来为每个模块创建一个新进程,但这看起来很糟糕、效率低下而且呃。

我内心深处有一种感觉,这在 .NET 中不会是微不足道的,但无论如何我想提出这个问题,FSI 做到了......我想知道我是否可以利用 FSI API 或其他东西(或至少复制他们的代码)?

TL;DR 我阅读了以下有关 erlang 的内容,并希望在 F# 中为自己使用它。 Erlang:有没有办法用 rebar 将更改的模块重新加载到已经运行的节点中?

“...只要程序中的模块在磁盘上发生更改,重新加载器就会自动替换正在运行的副本。”

4

2 回答 2

0

我不知道这是否适用于 FS,但在 ML 中,您可以加载一个主文件,该文件将您的所有文件加载到您的项目中,然后执行您需要用来将它们组合在一起并运行您的应用程序的任何代码。要查看从 REPL 内部运行的大型应用程序的示例,请查看剑桥计算科学实验室的 Isabelle/HOL 站点http://www.cl.cam.ac.uk/research/hvg/Isabelle/installation。 html. 下载应用程序后,在 src 代码目录中查找任何名为 root.ml 的文件。其中将有六个控制不同级别的实施。这是递归的,因为顶级文件可以调用加载该特定子功能的多个子目录中的文件。这允许根据执行的顶级文件将您的应用程序定位到各种场景。

于 2013-11-21T00:02:09.857 回答
0

典型的 .NET Framework 应用程序无法卸载/重新加载程序集,除非它们位于与应用程序一起启动的主要应用程序域不同的应用程序域中。这基本上是大多数插件系统是如何为在完整的 .NET Framework 上运行的应用程序设计的。在 .NET Core 中的 .NET Standard 2.0 之后,使用Collectible Assemblies功能,情况可能会发生变化。

参考:

于 2017-08-03T06:15:52.463 回答