Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

F#: Quotation with type definition?

Tags:

f#

quotations

I'm playing around with quotations and I can't see an expression pattern for type definitions. Is there really not one, or am I missing something?

<@@ type MyType (name:string) =
    member x.Name = name @@>

Gives "Unexpected keyword 'type' in quotation literal."

like image 957
zmj Avatar asked Jul 28 '10 16:07

zmj


People also ask

Facebook itu apa sih?

Facebook adalah media sosial dan layanan jejaring sosial online Amerika yang dimiliki oleh Meta Platforms.


1 Answers

You can't. You can only quote code, that is to say, any valid F# expression. Type definitions are not considered as code, but definitions.

What you might want to do is put ReflectedDefinition attribute on a type members:

type MyType (name : string) =
    [<ReflectedDefinition>] member x.Name = name

If you want to retrieve the AST of members that have ReflectedDefinition you can use Expr.TryGetReflectedDefinition function.

E.g, this sample code prints ASTs of all reflected definition members of MyType:

open Microsoft.FSharp.Quotations
open System.Reflection

type MyType (name : string) =
    [<ReflectedDefinition>] member x.Name = name

let mis = typeof<MyType>.GetMembers()
for mi in mis do
    try
        match Expr.TryGetReflectedDefinition(mi :?> MethodBase) with
        | Some(e) ->  printfn "%A" e
        | None    -> ()
    with _ -> ()
()
like image 176
Stringer Avatar answered Oct 17 '22 17:10

Stringer