F# Literate 将参数传递给脚本文件

F# Literate pass arguments to script file

我正在使用 F# 格式化来做一些 Literate 编程。

我的用例是我有几百个数据集需要 运行 通过,并且我想为每个数据集创建一个 "report" 的一些统计数据和图表。它们都是相同的格式。

所以我想要的是只有一个带有 F# 代码和 markdown 的 fsx 脚本文件,它可以在一个循环中被解析以生成单独的 html 个文件。

我当前的代码如下所示:

// Create FSI evaluator with transformation enabling charts to show.
let fsiEval = FsiEvaluator() 
fsiEval.RegisterTransformation(transformation)
let source = __SOURCE_DIRECTORY__
let template = Path.Combine(source, "zeros.html")
let script = Path.Combine(source, "zeros.fsx")
Literate.ProcessScriptFile(script, templateFile = template, fsiEvaluator = fsiEval, output = "rendered.html")

这工作正常,但我必须在 "zeros.fsx" 文件中硬编码我正在查看的数据集。我想将参数传递给此方法:

Literate.ProcessScriptFile(script, templateFile = template, fsiEvaluator = fsiEval, output = "rendered.html")

所以我可以遍历它并生成我所有不同的报告。但是我在文档中找不到如何做到这一点。

您可以 运行 使用 fsiEval 对象之前的任意 F# 代码 运行 脚本,因此一种方法是编写一些定义全局变量的代码变量,然后将从脚本中可见(尽管在编辑脚本时您会在 F# 编辑器中收到错误...)。执行此操作的代码:

let fsiEval = FsiEvaluator() 
let ifsi = fsiEval :> IFsiEvaluator
ifsi.Evaluate("let magic = 40", false, None)

我的测试文件现在显示结果为 42:

let res = 2 + magic
(*** include-value: res ***)

这适用于您可以通过源代码合理传递的配置 - 我不确定是否有将更复杂的对象传递给脚本的好方法。