2010-02-15 13 views
8

Estoy tratando de traducir el siguiente ejemplo de C#, que construye un módulo de IronPython, a F #.Usando atributos de ensamblaje en 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"); 
    } 
} 

Usando PythonModule permite from my_module import *, entre otras cosas.

Tengo problemas para averiguar cómo aplicar el atributo PythonModule en F #. La documentación de F # solo habla de los atributos de ensamblaje relacionados con los módulos y se adjunta a do(). No tengo claro cómo definir las clases estáticas que se interpretan como módulos de Python, pero no soy un experto en C#/F #/IronPython.

Respuesta

6

que no tienen todos los bits a la mano para ver si esto funciona, pero me gustaría probar

open System 
open IronPython.Runtime 

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

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

para empezar.

+0

Esto funciona. Después de agregar el dll, 'import my_module' funciona como se esperaba. El módulo ficticio parece un poco gracioso, pero puedo vivir con eso. – Tristan

4

no lo he probado, pero ...

module MyModule 

open System 
open IronPython.Runtime 

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

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

Igual que la de Brian, pero sin el módulo comodín.

+0

Me temo que 'typeof ' no funcionará para 'MyModule', porque no es un tipo, sino un módulo (al menos no lo fue, la última vez que lo revisé). Esta es una limitación molesta, porque escribir funciones F # en lugar de clases estáticas sería genial. –

+0

(Casi consideraría utilizar alguna solución realmente desagradable para que esto funcione, porque sería muy agradable escribir funciones sencillas de F # - por ejemplo, podría escribir el atributo 'assembly' en C# y luego usar "ILMerge" para fusionarlas en uno) –

+0

Tampoco quiero usar un módulo directamente, porque no puedo sobrecargar hello_world. Al usar métodos estáticos obtengo funciones sobrecargadas en Python. – Tristan

Cuestiones relacionadas