Commits

jun....@gmail.com  committed b2861e0

update

  • Participants
  • Parent commits c446ddf

Comments (0)

Files changed (1)

 中の人がぼんやりしてたら、外の人がモジュールをごにょごにょ操作するしまくる
 OCaml プログラミングスタイルというのを確立してしまった感がある。特に Jane Street 
 のコードや俺のコードはモジュールをあっちこっちにエイリアスしたりインクルードしたり
-大変。それはそれで便利なんだが、実は重かった:
+大変。それはそれで便利なんだが、実は重かった。例えば、次のような stdlib のモジュールを
+何も考えずに全部エイリアスするコード、
 
-    module M = Pervasives
+    module Arg = Arg
+    module Array = Array
+    module ArrayLabels = ArrayLabels
+    module Buffer = Buffer
+    module Callback = Callback
+    module Char = Char
+    module Complex = Complex
+    module Digest = Digest
+    module Filename = Filename
+    module Format = Format
+    module Gc = Gc
+    module Genlex = Genlex
+    module Hashtbl = Hashtbl
+    module Int32 = Int32
+    module Int64 = Int64
+    module Lazy = Lazy
+    module Lexing = Lexing
+    module List = List
+    module ListLabels = ListLabels
+    module Map = Map
+    module Marshal = Marshal
+    module MoreLabels = MoreLabels
+    module Nativeint = Nativeint
+    module Obj = Obj
+    module Oo = Oo
+    module Parsing = Parsing
+    module Pervasives = Pervasives
+    module Printexc = Printexc
+    module Printf = Printf
+    module Queue = Queue
+    module Random = Random
+    module Scanf = Scanf
+    module Set = Set
+    module Sort = Sort
+    module Stack = Stack
+    module StdLabels = StdLabels
+    module Stream = Stream
+    module String = String
+    module StringLabels = StringLabels
+    module Sys = Sys
+    module Weak = Weak
 
+これを 4.01.0 でコンパイルすると結果はこんなサイズ:
+
+    -rwxr-xr-x 1 161780 m.cmi
+    -rwxr-xr-x 1   2486 m.cmo
+    -rwxr-xr-x 1  68919 m.cmx
+    -rw-r--r-- 1    943 m.ml
+    -rw-r--r-- 1   3100 m.o
+
+これを 4.02.0 では
+
+    -rwxr-xr-x 1 2571 m.cmi <---- !!!
+    -rwxr-xr-x 1 2405 m.cmo
+    -rwxr-xr-x 1 2499 m.cmx
+    -rw-r--r-- 1  943 m.ml
+    -rw-r--r-- 1 1521 m.o   <---- !!!
+
+おお、はじめは `.cmo` だけ見てたので意義が判らなかったが、 signature (`.cmi`)
+と native code (`.cmx` と `.o`) は凄く小くなっている。どうも 4.01.0 以前では
+真面目に展開していた、その展開を止めてエイリアスにした、そういうことらしい。
 
 string は immutable の方向へ
 --------------------------------
 
 * 難しい。とにかく複雑。ドキュメント無いし
 * パーステクノロジが違う。OCaml バニラは lex+yacc だけど P4 はストリームパーサー。ただし文法拡張ができる。
-* 文法拡張するので拡張部分の事を知らないプログラム機械的に読み込めない。
+* 文法拡張するので拡張部分の事を知らないプログラムでは拡張を使ったコードを機械的に読み込めない。
 * プリプロセスの手間がかかりどうしても遅い
 
 で、この attributes では、もう文法拡張は止めましょう。その代り、 AST の好きなところにマークを
 と書かせたいみたいだけど、醜いよね。普通の `let` と `let%lwt` が混在してだらららーっ
 と並んでたら結構鬱になる気がするが…
 
-と思ったら [OMonad](https://github.com/danmey/omonad) というので pa_monad っぽいの書けるのねえ:
+[OMonad](https://github.com/danmey/omonad) というので pa_monad っぽいの書けるのねえ:
 
-    let vs = perform ([|x; y|] <-- [[|1; 2|]; [||]; [|3; 4; 5|]; [|6; 7|]];
-                      return (x + y)) in
+    let vs = perform (
+      [|x; y|] <-- [[|1; 2|]; [||]; [|3; 4; 5|]; [|6; 7|]];
+      return (x + y)
+    ) in
 
-んー? `perform ([|x; y|] <-- [...]; ...)` ってことは、 `<--` は普通の二項演算子、
+んー? `[|x; y|] <-- [|...|]` ってことは、 `<--` は普通の二項演算子、
 てことはこの左辺 `[|x; y|]` は pattern の様に見えて、実は AST 上では expression なのか…
-filter で expression から pattern に変換しているのだな…そう見た。 キモい。
+filter で expression から pattern に変換しているのだな… OMonad のコードでも確認した。
+これはキモい。
 
 うーん、 OCaml バニラ構文に閉じ籠るのはいいんだけど、じゃあバニラ構文今で足りてるのかというと、
 ということで、 P4 無くなったのはいいけど P4 の柔軟性無くなったのはキツいんじゃないですか。
 
-LablTk が本体から消える
-----------------------------
-
-まあ、これ私が大分遊んだやつなんだけど、今更 Tcl/Tk とかねぇ。GUI は外に出しましょう!
-
-Camlp4 が本体から消える
-------------------------------
-
-これは p4 が終わりということではなくて、別のレポジトリで管理されるということなんだけれども、
-もちろん、 p4 は終わりという意味です。
-
 Open extensible types
 -----------------------------
 
 そもそも例外を発生させないライブラリ作りをするべきでは。キモい。
 
 まあ単なる糖衣のはずなので使って問題ないはず。
+
+LablTk が本体から消える
+----------------------------
+
+まあ、これ私が大分遊んだやつなんだけど、今更 Tcl/Tk とかねぇ。GUI は外に出しましょう!
+
+Camlp4 が本体から消える
+------------------------------
+
+これは p4 が終わりということではなくて、別のレポジトリで管理されるということなんだけれども、
+もちろん、 p4 は終わりという意味です。