FSharp.Text.TypedTemplateProvider 1.1.0

建议的替代方案

Trulla

dotnet add package FSharp.Text.TypedTemplateProvider --version 1.1.0                
NuGet\Install-Package FSharp.Text.TypedTemplateProvider -Version 1.1.0                
此命令旨在在 Visual Studio 的包管理器控制台中使用,因为它使用 NuGet 模块的版本Install-Package.
<PackageReference Include="FSharp.Text.TypedTemplateProvider" Version="1.1.0" />                
对于支持 PackageReference 的项目,请将此 XML 节点复制到项目文件中以引用包。
paket add FSharp.Text.TypedTemplateProvider --version 1.1.0                
#r "nuget: FSharp.Text.TypedTemplateProvider, 1.1.0"                
#r 指令可用于 F# Interactive 和 Polyglot Notebooks。将其复制到交互式工具或脚本的源代码中,以引用该包。
// Install FSharp.Text.TypedTemplateProvider as a Cake Addin
#addin nuget:?package=FSharp.Text.TypedTemplateProvider&version=1.1.0

// Install FSharp.Text.TypedTemplateProvider as a Cake Tool
#tool nuget:?package=FSharp.Text.TypedTemplateProvider&version=1.1.0                

TypedTemplateProvider (又称 "Trulla")

...一个 F# 强类型文本模板提供程序!

状态:仍在实验中

NuGet Badge

#r "nuget: FSharp.Text.TypedTemplateProvider, 0.0.0-alpha01"

open FSharp.Text.TypedTemplateProvider

let [<Literal>] TestTemplate = """
    Hello {{user.name}}, how are you?

    Your Orders
    ===

    {{for order in orders}}ID: {{order.id}}
    ({{if order.isActive}}active{{else}}inactive{{end}})
    ---
    {{end}}
    """

// All types required by the given template
// are infered and provided:
type Tmpl = Template<TestTemplate>

// Instanciate a typed model for the tempalte.
let templateModel =
    Tmpl.Root(
        [
            Tmpl.order(false, "Order 1")
            Tmpl.order(true, "Order 2")
        ],
        Tmpl.user("Hans"))

// Render and print it:
Tmpl.Render(templateModel) |> printfn "%s"

这将打印

    Hello Hans, how are you?

    Your Orders
    ===

    ID: Order 1
    (inactive)
    ---
    ID: Order 2
    (active)
    ---

FSharp.Text.TypedTemplateProvider 的方法

  • 提供带有
    • 模板参数
    • 迭代
    • 条件
  • 从给定的模板推断出一个模型类型。
  • 用户提供了一个用于渲染最终模板的模型实例。

限制(当前)

  • 模型将仅包含以下类型的字段
    • 列表
    • 字符串(用于模板孔)
    • 布尔型
  • 目前不支持部分模板

实现说明

模板提供程序的实施可能很有趣,因为它包含(以一种简单形式)构成编程语言所需的构建块。它包含以下内容:

解析器 Parsing.fs 使用 FParsec 实现。解析器的输出是符号序列

type Token =
    | Text of string
    | Hole of PVal<MemberToken>
    | For of ident: PVal<string> * exp: PVal<MemberToken>
    | If of PVal<MemberToken>
    | Else
    | End
    
and MemberToken =
    | AccessToken of {| instanceExp: PVal<MemberToken>; memberName: string |}
    | IdentToken of string

未类型化的 AST Ast.fs,它从解析的符号序列构建而成


type TVar =
    | Root
    | TVar of int

type private BindingContext = Map<string, TVar>

type TVal<'a> =
    { 
        range: Range
        tvar: TVar
        bindingContext: BindingContext
        value: 'a 
    }
    override this.ToString() = sprintf "(%A)%A" this.range this.value

type TExp =
    | Text of string
    | Hole of TVal<MemberExp>
    | For of ident: TVal<string> * exp: TVal<MemberExp> * body: TExp list
    | If of cond: TVal<MemberExp> * body: TExp list
    | Else of cond: TVal<MemberExp> * body: TExp list

and Body = BindingContext * TExp list

and MemberExp =
    | AccessExp of {| instanceExp: TVal<MemberExp>; memberName: string |}
    | IdentExp of string

type Typ =
    | Mono of string
    | Poly of name: string * typParam: Typ
    | Field of Field
    | Record of TVar
    | Var of TVar

and Field = 
    { 
        name: string
        typ: Typ
    }

求解器 Solver.fs 为 AST 中的记录和标识符类型化

type RecordDef =
    {
        id: TVar
        fields: Field list
        name: string
    }

生成器(渲染器) Rendering.fs 将所有这些转换成最终的字符串。

待办事项

  • 阴影(说明)
  • 绑定中的通配符
  • 模板表达式的开始和结束字符序列是可以配置的,并且无法绕过它们。请选择一个不会出现在您的模板中的字符序列。
产品 兼容的以及额外的计算目标框架版本。
.NET net5.0 已计算。 net5.0-windows 已计算。 net6.0 已计算。 net6.0-android 已计算。 net6.0-ios 已计算。 net6.0-maccatalyst 已计算。 net6.0-macos 已计算。 net6.0-tvos 已计算。 net6.0-windows 已计算。 net7.0 已计算。 net7.0-android 已计算。 net7.0-ios 已计算。 net7.0-maccatalyst 已计算。 net7.0-macos 已计算。 net7.0-tvos 已计算。 net7.0-windows 已计算。 net8.0 已计算。 net8.0-android 已计算。 net8.0-browser 已计算。 net8.0-ios 已计算。 net8.0-maccatalyst 已计算。 net8.0-macos 已计算。 net8.0-tvos 已计算。 net8.0-windows 已计算。
.NET Core netcoreapp2.0 已计算。 netcoreapp2.1 已计算。 netcoreapp2.2 已计算。 netcoreapp3.0 已计算。 netcoreapp3.1 已计算。
.NET Standard netstandard2.0 兼容。 netstandard2.1 已计算。
.NET Framework net461 已计算。 net462 已计算。 net463 已计算。 net47 已计算。 net471 已计算。 net472 已计算。 net48 已计算。 net481 已计算。
MonoAndroid monoandroid 已计算。
MonoMac monomac 已计算。
MonoTouch monotouch 已计算。
Tizen tizen40 已计算。 tizen60 已计算。
Xamarin.iOS xamarinios 已计算。
Xamarin.Mac xamarinmac 已计算。
Xamarin.TVOS xamarintvos 已计算。
Xamarin.WatchOS xamarinwatchos 已计算。
兼容的目标框架
包含的目标框架(在包中)
了解更多关于 目标框架.NET 标准化
  • .NETStandard 2.0

NuGet 包

此包未由任何 NuGet 包使用。

GitHub 仓库

此包未由任何流行的 GitHub 仓库使用。

1.0.0
     - 初始版本

     1.0.1
     - #5: 不要引用FSharp.Core 7
     - #6: 构造函数参数的稳定排序