2010-02-15 28 views
8

Sto provando a tradurre il seguente esempio C#, che costruisce un modulo IronPython, in F #.Utilizzo degli attributi di assieme in F #

using System; 
using IronPython.Runtime; 

[assembly: PythonModule("my_module", typeof(MyModule))] 

public static class MyModule { 
    public static void hello_world() { 
     Console.WriteLine("hello world"); 
    } 
} 

Utilizzando PythonModule permette from my_module import *, tra le altre cose.

Non riesco a capire come applicare l'attributo PythonModule in F #. La documentazione di F # parla solo degli attributi di assemblaggio relativi ai moduli e collegati a do(). Non mi è chiaro come definire le classi statiche che sono interpretate come moduli python, ma non sono un esperto di C#/F #/IronPython.

risposta

6

Non ho tutti i bit a disposizione per vedere se questo funziona, ma vorrei provare

open System 
open IronPython.Runtime 

type MyModule = 
    static member hello_world() = 
     Console.WriteLine("hello world") 

module DummyModuleOnWhichToAttachAssemblyAttribute = 
    [<assembly: PythonModule("my_module", typeof<MyModule>)>] 
    do() 

per cominciare.

+0

Questo funziona. Dopo aver aggiunto la DLL, 'import my_module' funziona come previsto. Il modulo fittizio mi sembra un po 'strano, ma posso conviverci. – Tristan

4

non ho provato, ma ...

module MyModule 

open System 
open IronPython.Runtime 

let hello_world() = 
    Console.WriteLine "Hello, World." 

[<assembly: PythonModule("my_module", typeof<MyModule>)>] 
do() 

Uguale a Brian, ma senza il modulo fittizio.

+0

Ho paura che 'typeof ' non funzioni per 'MyModule', perché non è un tipo, ma un modulo (almeno non lo ha fatto, l'ultima volta che ho controllato). Questa è una seccante limitazione, perché scrivere funzioni F # invece di classi statiche sarebbe semplicemente fantastico! –

+0

(Prenderò in considerazione l'utilizzo di qualche soluzione davvero brutta per farlo funzionare, perché sarebbe davvero bello scrivere semplici funzioni F # - ad esempio potresti scrivere l'attributo 'assembly' in C# e poi usare" ILMerge "per unirli in uno) –

+0

Anche io non voglio usare direttamente un modulo, perché non posso sovraccaricare hello_world. Usando metodi statici ottengo funzioni sovraccariche in Python. – Tristan

Problemi correlati