2010-02-15 2 views
8

Я пытаюсь перевести следующий пример C#, который строит модуль IronPython, в F #.Использование атрибутов сборки в 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"); 
    } 
} 

Использование PythonModule позволяет from my_module import *, между прочим.

У меня возникли проблемы с выяснением способа применения атрибута PythonModule в F #. Документация F # говорит только об атрибутах сборки, связанных с модулями, и прикрепляется к do(). Мне непонятно, как определять статические классы, которые интерпретируются как модули python, но я не эксперт C#/F #/IronPython.

ответ

6

Я не все биты под рукой, чтобы увидеть, если это работает, но я хотел бы попробовать

open System 
open IronPython.Runtime 

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

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

для начинающих.

+0

Это работает. После добавления dll 'import my_module' работает, как и ожидалось. Фиктивный модуль кажется немного забавным, но я могу жить с этим. – Tristan

4

не проверял, но ...

module MyModule 

open System 
open IronPython.Runtime 

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

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

же, как Брайан, но без модуля вставную.

+0

Боюсь, что 'typeof ' не будет работать для 'MyModule', потому что это не тип, а модуль (по крайней мере, этого не было, в последний раз я проверил). Это раздражающее ограничение, потому что писать функции F # вместо статических классов было бы просто здорово! –

+0

(Я бы почти подумал об использовании некоторого действительно неприятного обходного пути, чтобы заставить это работать, потому что было бы так приятно писать простые функции F # - например, вы могли бы написать атрибут 'assembly' на C#, а затем использовать« ILMerge », чтобы объединить их в один) –

+0

Я также не хочу использовать модуль напрямую, потому что я не могу перегрузить hello_world. Используя статические методы, я перегружаю функции в Python. – Tristan

Смежные вопросы