FSharp.Text.TypedTemplateProvider 1.1.0
建议的替代方案
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
NuGet 团队不提供对此客户端的支持。请联系其 维护者 以获得支持。
#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
NuGet 团队不提供对此客户端的支持。请联系其 维护者 以获得支持。
TypedTemplateProvider (又称 "Trulla")
...一个 F# 强类型文本模板提供程序!
状态:仍在实验中
#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 已计算。 |
-
.NETStandard 2.0
- FParsec (>= 1.1.1)
NuGet 包
此包未由任何 NuGet 包使用。
GitHub 仓库
此包未由任何流行的 GitHub 仓库使用。
版本 | 下载 | 最后更新 | |
---|---|---|---|
1.1.0 | 285 | 3/15/2023 | |
1.0.1 | 322 | 1/14/2023 | |
1.0.0 | 322 | 12/27/2022 | |
0.0.0-alpha05 | 130 | 12/22/2022 | |
0.0.0-alpha03 | 125 | 12/22/2022 | |
0.0.0-alpha02 | 128 | 12/21/2022 | |
0.0.0-alpha01 | 125 | 12/21/2022 |
1.0.0
- 初始版本
1.0.1
- #5: 不要引用FSharp.Core 7
- #6: 构造函数参数的稳定排序