Open9

OCamlのlwtからeioまで

podhmopodhmo

昔触ってたけれどもはや教科書レベルのことしか覚えていないので色々調べて確かめたい。

テキトーにgeminiに聞いたあとにその内容を確かめたい。

https://gist.github.com/podhmo/3e3c1a1d0b7903c3da5e24e6a5704dc6

podhmopodhmo

OCaml Lwt チュートリアル

  • Lwtとは何か、なぜ必要か?
    • ノンブロッキングI/Oと協調的マルチタスキングの実現。
    • ブロッキングI/Oの問題点(リソース浪費、応答性低下)の解決。
  • セットアップと最初のLwtプログラム
    • opam でのインストール (lwt, lwt_ppx)。
    • dune ファイルでの設定。
    • Lwt.returnLwt_main.run
  • Lwtのコアコンセプト: Promiseとlet*構文
    • 'a Lwt.t (Promise) の概念。
    • Lwt.bind (>>=) とその糖衣構文 let*
  • エラーハンドリング
    • Lwt.failLwt.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のテストコード
    • AlcotestAlcotest_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 など。
  • Eioのセットアップと最初のプログラム
    • インストールとdune設定。
    • Eio_main.run と環境 env
  • Eioのコアコンセプト
    • 環境 (env)、フロー (Flow)、ファイバー (Fiber)、スイッチ (Switch)。
    • エラーハンドリング(標準の try ... with ...)。
  • Lwt資産との連携: Lwt_eio
    • LwtのPromiseとEioのファイバーの相互変換。
  • Eioの利点と考慮点
  • Eioのテストコード
    • AlcotestAlcotest_eio の利用。
    • テストケースの型 (Eio_main.yoki -> unit)。
    • Alcotest_eio.run
    • 環境 envSwitch のテストでの扱い。
    • モックと環境の注入。
podhmopodhmo

思うこと

  • なんかいい感じにテストを書きたい
  • lwt付近でのコードの書き方とかを把握したい
    • eioへの切り替えをやっていきたい
podhmopodhmo

あと普通に考えるなら以下とかも把握するべきか

  • jsonのencode/decode
  • コマンドライン引数の取り扱い
  • http request(eioとかに含まれてそう)
  • サブシェル