F# resolveTopDef,TopDefnApp,ResolveTopDefinition?

F# resolveTopDef,TopDefnApp,ResolveTopDefinition?,f#,quotations,F#,Quotations,@Tomasp有几个blog条目()引用了一种使用[]和ResolveTopDefinition从方法中提取引用的方法,作为在中包装定义的替代方法(或者是?) 在任何情况下,我现在都无法编译这些东西,我认为这些功能已经改变了——但我不知道我在谷歌上找到的关于这些名字的唯一提及是什么,或者与托马斯的博客和作品有关 目前的做法是什么 我已经看过Eval.TryGetReflectedDefinition,但这需要一个MethodBase,而且这种方法似乎没有必要,除非我试图反思另一个/已经编译的程序

@Tomasp有几个blog条目()引用了一种使用
[]
ResolveTopDefinition
从方法中提取引用的方法,作为在
中包装定义的替代方法(或者是
?)

在任何情况下,我现在都无法编译这些东西,我认为这些功能已经改变了——但我不知道我在谷歌上找到的关于这些名字的唯一提及是什么,或者与托马斯的博客和作品有关

目前的做法是什么

我已经看过Eval.TryGetReflectedDefinition,但这需要一个MethodBase,而且这种方法似乎没有必要,除非我试图反思另一个/已经编译的程序集


谢谢

关于引用和反射方法定义的API已经发生了很大的变化(我在早期写了一些博客文章),所以这是我博客中最过时的部分。对不起

无论如何,以下简单片段演示了当前的API:

[<ReflectedDefinition>]
let foo a b = a + b

open Microsoft.FSharp.Quotations

match <@@ foo 1 2 @@> with
// Matches a call to a static method that is marked as `ReflectedDefinition`
| Patterns.Call(None, DerivedPatterns.MethodWithReflectedDefinition body, args) -> 
    // Return the actual quotation - simply call the body that represents 
    // the function with all the arguments as arguments.
    Expr.Applications(body, args |> List.map (fun a -> [a]))
| e -> e
[]
设foo a b=a+b
打开Microsoft.FSharp.quotes
匹配
//匹配对标记为“ReflectedDefinition”的静态方法的调用`
|Patterns.Call(无,DerivedPatterns.MethodWithReflectedDefinition正文,args)->
//返回实际的引号-只需调用表示
//将所有参数作为参数的函数。
Expr.Applications(body,args |>List.map(fun a->[a]))
|e->e
如果您正在进行大量的报价处理,那么最好同时打开
模式
派生模式
,以缩短代码(但另一方面,“dot”使浏览模块变得容易)


这里的关键是
MethodWithReflectedDefinition
,它是一种模式,可以匹配任何
MethodInfo
(属性也有类似的模式),当它是一个具有
ReflectedDefinition
属性的方法时,返回它的引号。您还可以将属性放置在包含函数的模块上。

引用和反射方法定义的API已经发生了很大的变化(我在早期写了一些博客文章),因此这是我博客中最过时的部分。对不起

无论如何,以下简单片段演示了当前的API:

[<ReflectedDefinition>]
let foo a b = a + b

open Microsoft.FSharp.Quotations

match <@@ foo 1 2 @@> with
// Matches a call to a static method that is marked as `ReflectedDefinition`
| Patterns.Call(None, DerivedPatterns.MethodWithReflectedDefinition body, args) -> 
    // Return the actual quotation - simply call the body that represents 
    // the function with all the arguments as arguments.
    Expr.Applications(body, args |> List.map (fun a -> [a]))
| e -> e
[]
设foo a b=a+b
打开Microsoft.FSharp.quotes
匹配
//匹配对标记为“ReflectedDefinition”的静态方法的调用`
|Patterns.Call(无,DerivedPatterns.MethodWithReflectedDefinition正文,args)->
//返回实际的引号-只需调用表示
//将所有参数作为参数的函数。
Expr.Applications(body,args |>List.map(fun a->[a]))
|e->e
如果您正在进行大量的报价处理,那么最好同时打开
模式
派生模式
,以缩短代码(但另一方面,“dot”使浏览模块变得容易)


这里的关键是
MethodWithReflectedDefinition
,它是一种模式,可以匹配任何
MethodInfo
(属性也有类似的模式),当它是一个具有
ReflectedDefinition
属性的方法时,返回它的引号。您还可以将属性放置在包含函数的模块上。

Awesome!如果我想得到相同的体函数而不提供参数呢?可能吗?也就是说,如果我只将
提供给
匹配
(因为我想将其翻译成另一种语言,在一个环境中提供一个类型的值,该类型的实例在本地不可用。)您也可以从
中提取主体-您必须查看由此生成的引用,并提取位于某处的
MethodInfo
。我认为编译器实际上会将其视为
fooab@@@>
,因此您需要
模式。Lambdas
首先。太棒了!如果我想得到相同的体函数而不提供参数呢?可能吗?也就是说,如果我只将
提供给
匹配
(因为我想将其翻译成另一种语言,在一个环境中提供一个类型的值,该类型的实例在本地不可用。)您也可以从
中提取主体-您必须查看由此生成的引用,并提取位于某处的
MethodInfo
。我认为编译器实际上会将其视为
fooab@@@>
,因此首先需要
Patterns.Lambdas