Arantium Maestum

プログラミング、囲碁、読書の話題

2020-06-01から1ヶ月間の記事一覧

Monadic Reflectionについて

kontlang作成の一つの目標は、この資料を元に: モナドをつくろう from dico_leque www.slideshare.net モナドをつくれるようにしてみたい、というものだった。 結果的にMaybe、ListやStateモナドを「つくって」みたのだが。 そもそもこのつくったものは本当…

めざそう言語処理系の沼 〜shift/resetへの旅 〜 その22 モジュール

実装したモナドやmap、fold_leftなどの関数をライブラリ化することで毎回定義し直さなくても済むようにしたい。 その準備段階としてモジュールを実装する。(ファイルから読み込む場合もモジュールとして扱いたいため) 具体的には (module [...])という構文…

merlinサポートのあるエディタでOCamlを書いていて微妙にイラっとくること

私は現在Visual Studio CodeでOCaml & Reason IDEを使っている。 全般的に非常に気に入っているのだが、一つ頻繁に起きて心をすこしだけささくれ立たせることがあるので書き出しておく。OCaml & Reason IDEプラグインはエラー検出などにmerlinを使っているの…

めざそう言語処理系の沼 〜shift/resetへの旅 〜 その21 やはり俺のListモナドはまちがっている。

前回こう書いた: ちなみにこの記事を書いている最中にListモナド実装にも重大なミスがあることに気づいた 今回はその話。 reifyの型 Representing Monadsのreifyとreflectの型定義: signature RMONAD = sig structure M : MONAD val reflect : '1a M.t -> …

めざそう言語処理系の沼 〜shift/resetへの旅 〜 その20 Stateモナドとreflect

前回このように書いた: Stateモナドにはreflectに直接当たる処理はなく、getとputの二つの関数がモナディックな処理を担う。 しかし「限定継続を使ってモナドを表現する」というアイデアの元となるRepresenting Monadsという論文を読み直していたらちゃんと…

めざそう言語処理系の沼 〜shift/resetへの旅 〜 その19 shift/resetでつくるStateモナド

shiftとresetを使ってStateモナドを実装する。ちなみに今まで実装したモナドの中で随一のややこしさである。 Stateモナドはその名のとおり、計算に局所的な「状態」を持たせることができるモナドである。状態とは「値を参照したり書き換えたりできる何か」を…

めざそう言語処理系の沼 〜shift/resetへの旅 〜 その18 shift/resetでつくるListモナド

前回のMaybeモナドに続いて、非決定性を扱うためのListモナドをつくってみたい。 非決定性の説明に関してはSICPを参照してほしい: sicp.iijlab.net 前回と同じくreifyとreflect(実装内容は違うが)、そして今回新たにreturnを実装していく。 さらにreflect…

めざそう言語処理系の沼 〜shift/resetへの旅 〜 その17 shift/resetでつくるMaybeモナド

shiftとresetが実装できたのでそれらを使ってモナドっぽい機能を実装してみる。 手始めに以前も紹介したこの資料に出てくるMaybeモナド的なものを試してみたい: モナドをつくろう from dico_leque www.slideshare.net HaskellやOCamlでMaybeモナドといえばJ…

OCamlのFunctorをクラスっぽく使ってみた

OCamlのFunctorは一般的なOOPにおけるClassに似ているところと似ていないところがあるぞい。 最近1000行ほどのOCamlコードを一から書く機会があって、その時いろいろとFunctorを使ってみたのだが、気付いたらOOPっぽいことをしていて「面白いなー」「本当に…

めざそう言語処理系の沼 〜shift/resetへの旅 〜 その16 shift/reset

ついにshift / resetを実装するところまで到達! resetで区切った限定継続をshiftで取り出して使う、という言語機能だ。 shift/resetプログラミング入門に出てくるような処理が実装できるようになる: (* (reset (+ 3 (shift [k] (* 5 (k 2))) -1)) 2) この…

Shibuya.lisp #86 でKontlangについて発表した

「めざそう言語処理系の沼」の内容がようやく発表したところに追いついたので、遅ればせながら・・・ 5月28日のShibuya.lispがリモート開催されるということだったので、ひさしぶり(4年ぶりくらい・・・ 遠くに移ってしまったので・・・)に参加。 発表枠…

めざそう言語処理系の沼 〜shift/resetへの旅 〜 その15 末尾呼び出し最適化

関数型言語の多くはループを再帰で、あるいは再帰を使った高等関数(mapやfold / reduceなど)で表現することが多い。 命令型プログラミングで使われるforやwhileループだと「ループごとに現在の変数環境で何かが変わっている必要がある」、つまり「状態に対…

めざそう言語処理系の沼 〜shift/resetへの旅 〜 その14 ステップ実行インタプリタ

ここまで実装してきたインタプリタは 式を表す文字列をパースし 評価して 結果の値を表す文字列を返していた。 もちろんそれで正しいのだが、インタプリタの中でどのような挙動になって式が値に変換されているのかがわかりにくい。 限定継続のようにかなり微…