F# から FFI で Tcl を呼ぶ [OCaml]
SML# の FFI も簡単だった [1] けど F# の FFI も簡単。
module Tcl = begin
open System.Runtime.InteropServices
open Microsoft.FSharp.NativeInterop
[<DllImport(@"C:\\Tcl\\bin\\tcl84.dll", EntryPoint="Tcl_CreateInterp")>]
extern void* CreateInterp();
[<DllImport(@"C:\\Tcl\\bin\\tcl84.dll", EntryPoint="Tcl_Eval")>]
extern int Eval(void*, string);
[<DllImport(@"C:\\Tcl\\bin\\tcl84.dll", EntryPoint="Tcl_GetStringResult")>]
extern string GetStringResult(void*);
end
let _ =
let interp = Tcl.CreateInterp() in
Tcl.Eval(interp, "puts {Hello World}"); (* -> Hello World *)
Tcl.Eval(interp, "puts xxx {Hello World}");
print_string(Tcl.GetStringResult(interp)) (* -> can not find channel named "xxx" *)
F# 1.9.1.8 で動作させています。C 風の定義(が書ける!)の中に string 型とか埋め込んでしまってるのは勘で書いてみたらうまく動いている風なのですが、ひょっとしたらお作法に違反している可能性も。
F# は LINQ を統合していたり配列のパターンマッチが書けたりなど OCaml とは別の言語として進化しているようで何より。[2007-05-25追記] ここは一部勘違いでOCamlでも普通に配列のパターンマッチはできた。
なお、この記事は F# News の記事 [2] を参考にしました。
[1] http://blog.so-net.ne.jp/rainyday/2007-03-31
[2] http://fsharpnews.blogspot.com/2007/04/foreign-function-interface-ffi.html
2007-04-14 13:23
nice!(0)
コメント(0)
トラックバック(0)
コメント 0