【问题标题】:F# Literate pass arguments to script fileF# Literate 将参数传递给脚本文件
【发布时间】:2019-02-04 21:17:32
【问题描述】:

我正在使用 F# Formatting 进行一些Literate 编程。

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

所以我想要的是只拥有一个带有 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")

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

【问题讨论】:

    标签: f# f#-data literate-programming f#-scripting


    【解决方案1】:

    您可以在运行脚本之前使用 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 ***)
    

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

    【讨论】:

    • 谢谢托马斯。这对我的目的非常有用。如果需要一个复杂的对象,我想可以只使用一个 json 字符串并从那里开始。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-19
    • 2012-03-15
    • 2019-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多