RHG読書会::東京 Sound Stage

再び読書会へ

ふつうのLinuxプログラミングは RHG読書会::東京 Revolution::ふつうのLinuxプログラミング として専用のページを作りました。

美しい日本のMLコンパイラを読む会

2005-07-23 (土) タイムインターメディア 2F会議室にて 13:00 -

<URL:http://min-caml.sourceforge.net/>

発表資料

Rubyistのための超音速ML入門

>
 ふくもり
 ---------------------
 SML しかやってない(スピーカ)
  OCaml は実はいちやづけ

 オーディエンス(の一部)も(わらい)
 ---------------------
 とりあえず factrial

 let rec factorial n =
       if n = 1 then 1 else
       factorial (n - 1) * n

 でも,,,
 本命は

 let rec factorial = function
       |1 -> 1
       |n -> factorial (n - 1) * n

 fun と function の違い

 ---------------------
 対話型環境を使ってみる

 Cigwin だと DL のローディングでアレ
 MinGW を使えばたぶん幸せ
 ---------------------
 ふつ〜の計算

 # 123 + 456;;   ";;" <- これが付くと「ここで評価しろ」
 -:int=579

 "-:" ってのは
 "名前:", 捨てちゃったから "-"
 ---------------------
 # 123.0 +. 456.0;;  ( float の足し算が "+." )
 -:float = 579.

 Ocaml には単項 - がある
 ---------------------
 暗黙の型変換がない

 123.0 + 456;;
 ---------------------
 # 123.0 +. float_of_int 456;;
 -:float = 579.

 float_of_int は "float" でもいける(?)
 ---------------------
 変数の定義

 # let a = 1;;
 val a:int = 1

 # let x = "abc";;
 val x:string = "abc"

 型が表示される
 一行で複数...
 let x = "abc" and a = 1
 ---------------------
 let rec a = 1 and b = a とかすると
 "This kind of exp... is not allowed"
 ---------------------
 関数の定義

 関数の定義も let
 #let f x = x + 1;;
 val f:int -> int = <fun>
 型が表示  , じつは + で型推論が走っている
 ---------------------
 #let f x = x;;
 val f:'a -> 'a = <fun>
 ---------------------
 #let f x y = (x = y);;
 val f : 'a -> 'a -> bool = <fun>
 ---------------------
 #let f = f;;
 ????
 ---------------------
 # let g x y = x * y;;
 val g : int -> int -> int = <fun>
 SML では複数引数っていうか 1 個のタプルというスタイルが
 ふつう.OCaml ではこういうカリー化がふつう

 ηエクスパンションができない(?)
 ---------------------
 関数と変数の区別は
 ---------------------
 無名関数
 --
 以下は構文糖
 let f x = x + 1
 let f = fun x -> x + 1
 ---------------------
 関数型言語であるからして....

 変数に代入(変更)はできない

 "()" って何よ?

 #let counter = ();;
 val counter:unit = ()

 関数は同じ引数に対しては同じ値を返す
 ---------------------
 そのためのツール
 ---------------------
 リスト
 #[1;2;3];;
 -:int list=[1;2;3]

 タプル
 #(1,2,3);;
 -:int*int*int=(1,2,3)
 ---------------------
 リストのいろいろ

 #1::[2,3];;
 -:int list=[1;2;3]

 #1::2::3::[]
 -:int list=[1;2;3]
 ---------------------
 レコード型

 Ocaml では定義必要,SML では必要ない.
 (ほんとに必要?...)

 #type rt = {a:int; b:string};;
 type rt={a:int; b:string;}

 #let rv = {a=1; b="xyz"};;
 val rv:rt={a=1; b="xyz"}

 (OCaml ではぜんぶ type, SML では datatype)
 ---------------------
 ヴァリアント型

 #type vt = Apple | Banana | Orange;;
 type vt = Apple | Banana | Orange

 # let vv = Orange
 val vv:vt=Orange
 ---------------------
 引数が付くヴァリアント型
 ---------------------
 パターンマッチング

 let recc pp_list = function
       | [] -> ""
       | [x] -> x
       | x::xs -> x ^ " " ^ pp_list xs

 "^" は文字列の連結
 ---------------------
 ヴァリアントに対するパターンマッチング
 ---------------------
 モジュール
 ---------------------
 標準ライブラリ

 map
 # List.map (fun x -> x + 1) [1;2;3];;
 -:int list = [2;3;4]
 ---------------------
 List.fold_left
 ---------------------
 命令型処理

 # let counter = ref 0;;
 val counter : int ref = {contents = 0}
>

MinCaml を読む

>
 MinCaml とは

 OCaml のサブセット

 あるものとないもの

 あるもの
 ・型推論
 ・基本型
 ・派生型
 ・高階関数
 ないもの
 ・パターンマッチング
 ・
 ・

 モジュール

 12個

 yacc と lex も使っている

 syntax.ml -> Syntax モジュール
 typing.ml -> Typing モジュール
 ...

 ファイル名をキャピタライズしたのがモジュール名

 .mli モジュールインタフェース
 ----
 .mli インタフェースを押さえる

 モジュール名.f が主要な関数
 ----
 モジュール間のデータの流れ
 ずらずらと一気通貫に書く

 "モジュール.f" これは作者の流儀.
 f だけ export
 でもたまに g も export している.
 ----
 データ型定義を押さえる

 なんとか.t

 「K正規形」は context normal form (?)
 "??? ML Kit" というコンパイラキット (?)
 A正規形

 Syntax.t 構文の時のデータ型

 KNormal.t

 K正規形 - 引数が全て変数か定数 (プライマリ)
 ツリー
 ----
 型の表現 Type.t

 なんで関数引数についてはリストになってるのか?
 カリー化されてるならいらない
 タプルになってるにしても(タプルがあるんだから)いらない
  -- uncurried とコメントがある
 ----
 重要な変数とイディオム

 typing.ml とかで出てくる env という変数は

 Id.t (名前をキーとするMap)
 値は型だったり別名

 M.empty を初期値とし,再帰処理でこれをひきまわす
 --
 M.add x t env

 ex)
 M.add "a" Type.Int env

 env に "a"→Type.Int というマッピングを追加
 --
 M.mem x env
 x に対応する型・別名がenvに存在するか(member)

 etc
 ----
 型推論

 Typing モジュールで実行

 Syntax.t から Syntax.t への変換
 --
 Typing.f -- 外とのインタフェース

       v-- Syntax.t が渡されてくる
 let f e =
    extenv = M.empty
    ...
 --
 Typing.g -- 型推論本体

 let rec g env e = ...
    try
       match e with
       |Unit -> Type.Unit
       |Bool(_) -> Type.Bool
         --
       |Add(e1,e2)|Sub(e1,e2) ->
          unify Type.Int(g env e1);
          unify Type.Int(g env e2);
          Type.Int

 let x = e1 in e2 の型推論

       |Let((x,t),e1,e2)->
          unify t (g env e1);
          g (M.add x t env) e2

 では Typing.unify の中身は?

 let rec unify t1 t2 =
    match t1 t2 with
      | ...... (* 同じ型なら同じで ok *)
      | ...
 Var の場合
      |Type.Var({contents = None} as r1), _ ->
         if occur r1 t2 then raise (Unify(t1, t2));
         r1 := Some(t2)

 --

 KNormal.f

 Syntax.t から KNormal.t に

 KNormal.g

 (ごめんなさい,沈没しました(記録者))
>

二次会

なでしこと HSP の言語処理系を学ぶ会

2005-06-18 (土)タイムインターメディア 2F会議室にて 13:00 -

HSP

なでしこ

二次会

鈴木さんを囲む会

2005-05-14 (土)タイムインターメディア 2F会議室にて 13:00 -

(メモ消失)

二次会

三次会

arton さんを囲む会

2005-04-16 (土)タイムインターメディア 2F会議室にて 13:00 -

発表資料など: <URL:http://arton.no-ip.info/diary/20050417.html#p01>

二次会

Ruby On Rails について知る日なの?

2005-03-19 (土)タイムインターメディア 2F会議室にて 13:00 -

前座

高橋先生による WebApp 講座 〜 Rails 講座

二次会

YARVの発表会なの!

2005-02-12 (土)タイムインターメディア 2F会議室にて 13:00 -

YARV未踏発表準備

チョコレートが!

二次会

このまま名前は RHG 読書会なの?

2005-01-15 (土)タイムインターメディア 2F会議室にて 13:00 -

RHG 読書会準備会

次に読む本の候補

もう一度読みたいという人がいれば、その人達で独立して RHG 読書会

Ruby の会新年会



The RWiki