Open9
OCamlのlwtからeioまで
昔触ってたけれどもはや教科書レベルのことしか覚えていないので色々調べて確かめたい。
テキトーにgeminiに聞いたあとにその内容を確かめたい。
OCaml Lwt チュートリアル
-
Lwtとは何か、なぜ必要か?
- ノンブロッキングI/Oと協調的マルチタスキングの実現。
- ブロッキングI/Oの問題点(リソース浪費、応答性低下)の解決。
-
セットアップと最初のLwtプログラム
-
opamでのインストール (lwt,lwt_ppx)。 -
duneファイルでの設定。 -
Lwt.returnとLwt_main.run。
-
-
Lwtのコアコンセプト: Promiseと
let*構文-
'a Lwt.t(Promise) の概念。 -
Lwt.bind(>>=) とその糖衣構文let*。
-
-
エラーハンドリング
-
Lwt.fail、Lwt.catch。 -
try%lwt ... with ...構文。
-
-
Lwtによる並行処理
- 逐次実行と並行実行の比較 (
Lwt_unix.sleep)。 -
Lwt.join,Lwt.all,Lwt.both,Lwt.pick。
- 逐次実行と並行実行の比較 (
-
Lwtフレンドリーなライブラリの活用
-
Lwt_unix(UnixシステムコールのLwt版)。 -
Lwt_io(高レベルなI/Oチャネル操作)。
-
-
実践的な例: 非同期ファイル処理 (実際はHTTP GET)
-
cohttp-lwt-unixを使った複数URLからのコンテンツ取得。
-
-
Lwtを使う上での注意点とベストプラクティス
- LwtスレッドとOSスレッドの違い。
- ブロッキング呼び出しの回避。
- Promiseリークへの注意、
Lwt.async。
-
Lwtのテストコード
-
AlcotestとAlcotest_lwtの利用。 - テストケースの型 (
unit -> unit Lwt.t)。 -
Alcotest_lwt.check_raises。 -
Lwt_main.run (Alcotest_lwt.run ...)。 - モックの考え方。
-
Eioへの橋渡し
-
Eioとは何か、なぜLwtからの移行が考えられるか?
- Lwtの課題(コールバック地獄の残り香、協調的マルチタスキングの限界など)。
- Eioのアプローチ(構造化並行性、直接的スタイル、エフェクトハンドラ)。
-
LwtからEioへの主な概念の対比
- Promise vs 直接的スタイル、
let*vs 通常の逐次実行、Switchなど。
- Promise vs 直接的スタイル、
-
Eioのセットアップと最初のプログラム
- インストールと
dune設定。 -
Eio_main.runと環境env。
- インストールと
-
Eioのコアコンセプト
- 環境 (
env)、フロー (Flow)、ファイバー (Fiber)、スイッチ (Switch)。 - エラーハンドリング(標準の
try ... with ...)。
- 環境 (
-
Lwt資産との連携:
Lwt_eio- LwtのPromiseとEioのファイバーの相互変換。
- Eioの利点と考慮点
-
Eioのテストコード
-
AlcotestとAlcotest_eioの利用。 - テストケースの型 (
Eio_main.yoki -> unit)。 -
Alcotest_eio.run。 - 環境
envとSwitchのテストでの扱い。 - モックと環境の注入。
-
思うこと
- なんかいい感じにテストを書きたい
- lwt付近でのコードの書き方とかを把握したい
- eioへの切り替えをやっていきたい
ppx_derivingを使いつつテストコードを書く練習とかもしたほうが良さそう。どういうものが良いんだろう?
💭 実際にコードを動かしてからトピックを追加しよう。
あと普通に考えるなら以下とかも把握するべきか
- jsonのencode/decode
- コマンドライン引数の取り扱い
- http request(eioとかに含まれてそう)
- サブシェル
💭 OCaml本体のアップデートも追えてない。
簡単な利用方法としてはweb apiサーバーだけどdenoとかgoで良くない?という気がしてしまう。使い道になにがあるのだろう?
ビルドのこととかを考えるとlibuvとか気にしなければいけないところがやっぱりgoとかより面倒な気がする。
resultとかあったな。