gpt4 book ai didi

F# 引用对象图

转载 作者:行者123 更新时间:2023-12-04 17:59:14 25 4
gpt4 key购买 nike

在 C# 中,我可以使用表达式树很容易地创建对象图的字符串表示。

public static string GetGraph<TModel, T>(TModel model, Expression<Func<TModel, T>> action) where TModel : class
{
var method = action.Body as MethodCallExpression;
var body = method != null ? method.Object != null ? method.Object as MemberExpression : method.Arguments.Any() ? method.Arguments.First() as MemberExpression : null : action.Body as MemberExpression;
if (body != null)
{
string graph = GetObjectGraph(body, typeof(TModel))
return graph;
}
throw new Exception("Could not create object graph");
}

在 F# 中,我一直在查看 Quotations 以尝试做同样的事情,但无法完全弄清楚。我曾尝试使用 PowerPack 库将引用转换为表达式,但到目前为止还没有运气,而且互联网上关于这个主题的信息似乎相当稀少。

如果输入是:
let result = getGraph myObject <@ myObject.MyProperty @>

输出应该是“myobject.MyProperty”

最佳答案

您可以在 fsi session 中查看从引号表达式中得到的内容:

> let v = "abc"
> <@ v.Length @>;;
val it : Expr<int>
= PropGet (Some (PropGet (None, System.String v, [])), Int32 Length, [])

> <@ "abc".Length @>;;
val it : Expr<int>
= PropGet (Some (Value ("abc")), Int32 Length, [])

您可以找到可用于将 qoutations 解析为的所有事件模式的描述

手册\FSharp.Core\Microsoft.FSharp.Quotations.Patterns.html

在您的 F# 安装目录下或在 msdn site

Chris Smith 的书“Programming F#”有一本不错的书,其中有一章名为“Quotations”:)

所以,毕竟,只需尝试编写简单的解析器:
open Microsoft.FSharp.Quotations
open Microsoft.FSharp.Quotations.Patterns
open Microsoft.FSharp.Quotations.DerivedPatterns

let rec getGraph (expr: Expr) =
let parse args =
List.fold_left (fun acc v -> acc ^ (if acc.Length > 0 then "," else "") ^ getGraph v) "" args
let descr s = function
| Some v -> "(* instance " ^ s ^ "*) " ^ getGraph v
| _ -> "(* static " ^ s ^ "*)"
match expr with
| Int32 i -> string i
| String s -> sprintf "\"%s\"" s
| Value (o,t) -> sprintf "%A" o
| Call (e, methodInfo, av) ->
sprintf "%s.%s(%s)" (descr "method" e) methodInfo.Name (parse av)
| PropGet(e, methodInfo, av) ->
sprintf "%s.%s(%s)" (descr "property" e) methodInfo.Name (parse av)
| _ -> failwithf "I'm don't understand such expression's form yet: %A" expr

附言当然,您将需要一些代码来将 AST 转换为人类可读的格式。

关于F# 引用对象图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1930940/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com