Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

OCamlのトップレベルあれそれ

1,085 views

Published on

ML_Day#2 で発表したスライドです

Published in: Software
  • Be the first to comment

OCamlのトップレベルあれそれ

  1. 1. OCamlのトップレベルあれそれ ML Day#2 光のインターネットの闇 @no_maddo
  2. 2. OCamlにはトップレベルを いじる機能があるよ • compiler-libsのtopdirs.mli・toploop.mliに書い てある – add_directive – preprocess_phase, execute_phase • 事実上のeval – install_printer • ダイナミックな言語でやっているようなことが まぁまぁできる
  3. 3. install_printer (* formatter -> (int, int) Hashtbl.t -> unit *) let p fmt h = Hashtbl.to_seq h |> Seq.iter (fun (k, v) -> Format.fprintf fmt "key: %d, value: %d@." k v) ;; (* formatter -> (int, int) Hashtbl.t -> unit *) let p fmt h = Hashtbl.to_seq h |> Seq.iter (fun (k, v) -> Format.fprintf fmt "key: %d, value: %d@." k v) ;; $ #install_printer p $ h ;; - : (int, int) Hashtbl.t = key: 1, value: 100 $ #install_printer p $ h ;; - : (int, int) Hashtbl.t = key: 1, value: 100
  4. 4. eval let eval cmd = cmd |> Lexing.from_string |> !Toploop.parse_toplevel_phrase |> Toploop.execute_phrase true err_formatter |> ignore let eval cmd = cmd |> Lexing.from_string |> !Toploop.parse_toplevel_phrase |> Toploop.execute_phrase true err_formatter |> ignore $ eval “let x = 1 + 2;;” ;; $ x - : int = 6 $ eval “let x = 1 + 2;;” ;; $ x - : int = 6
  5. 5. ユースケース • ctypes – 生のメモリを表示するのに使っている • owl – 行列計算や計算グラフを使うライブラリ – 行列を綺麗にプリントするのに使っている • sexplib – プリンタ
  6. 6. よもや話1 • ocamldebugで複雑なことをするとき、 install_printerは必要 – OCamlのTyping • だが無力 – C FFIつかてるとき – Thread使うプログラム – ocamlcだけしかデバッグできない • GDBではpythonスクリプトで実現 – printで関数コールができるからいらない!
  7. 7. よもや話2 • ocamldebug.elが壊滅的に使いづらい – duneのビルドはシンボリックリンクをつくる – ocamldebugがどっちを開くかって毎回聞いてくる
  8. 8. なんでこんな話したか • Owlはeval + install_rinter + add_directiveで対 話環境をヘビーに使い倒すスタイル – OCamlで対話環境を真面目に使っているというの を初めて目撃した – ライブラリから、対話環境を弄り倒すという スタイルもありなんじゃないかと思いました

×