近況 2022-10-31

今月の活動 (GTKの勉強、WPF再訪、代数的パーサ、ほか)

GTKの勉強

  • リポジトリ: seven-gui-with-gtk-rust (現時点のバージョン)
  • 前回は5個目までやって、今月は最後の2つをやった
  • Circle Drawer (ペイント風アプリ):
    • ダイアログを出したり2D描画を行ったりと実践的な内容になっている
    • マウスの座標を取得する方法がよく分からなくて悩んだ (→ 実装)
      • 入力デバイス (input device) という抽象化を経由している
      • いま思うとマウス移動イベント (motion_notify_event) の際にマウス位置を保存しておいて、drawイベントの際にそれを使うという方法でもよかったかもしれない
    • 描画エリアの draw イベントは同期的に処理する必要があって、コールバックにメッセージを投げるといういままでの方法が通用しなかった
      • いま思うと、描画対象の状態を分けて持つとか、メッセージ処理を別スレッドにする (メッセージの処理完了を同期的に待つ) といった方法もあったかもしれない
    • メッセージのハンドラがビューに直接アクセスするモデルなので (つまりMVVMではない)、ダイアログの開閉はハンドラで行っている
      • WPFのときに書いたように開いているかどうかを状態で持つということをしていない
  • Cells (スプレッドシート):
    • グリッドの上にセルの入力ボックスを重ねるのが難しかった (→ 実装)
      • Overlayコンポーネントを使って解決した
      • スクロールに追従するように、スクロール枠(ScrolledWindow)の下に配置したいが、置く場所がない
      • ScrolledWindowの直下にはGridがある
      • 入力欄をグリッドの子要素にすると、(set_allocationしても) グリッドのセルとしてレイアウトされてしまった
      • ScrolledWindowの下に何かを挟むとGridがスクロール可能領域の中でうまくレイアウトされなかった (たしか、領域全体に広がってくれなかった)
    • 座標 (Coord) や座標をキーとする2次元配列 (GridArray) をうまく定義できるのはRustのよいところ (→ 実装)
    • インクリメンタル計算はトポロジカルソートを使って実装した (→ 実装)
      • 循環参照を検出できる、おそらくたいていのケースで高速に処理できる(はず)
      • これでも大きな範囲の sum とかが再計算対象になると計算量が高い
      • 平方分割とかを使うとよいのかもしれない
    • タスクの説明を読むと、ほんとうはコンポーネント化するところまでやったほうがよさそう
      • GTKのコンポーネントを作るのはなんとなく難しそうだと二の足を踏んでいる

WPF再訪

  • リポジトリ: wpf-enterprise-example (現時点のバージョン)
  • イベントハンドラから単に非同期処理を開始するのではなくビューモデルの状態として起こりうる非同期処理を持っておくとよいかもしれないという気がしてきた (?)
  • 結局、いまのところダイアログの表示の件しか改善点がなく、いまいち再訪の価値を得られていない

代数的パーサ

  • リポジトリ: algebraic-parser-fs (WIP)
  • パーサを (言語内の) DSLとして定義すると使いやすい気がしたので試している
    • 外部ファイルに構文を書く方式はとっつきづらい
      • 静的コード生成の場合、ビルドチェインに組み込む必要がある
      • ライブラリ定義の構文木を生成する場合、それを自前の抽象構文木に変換するところがめんどくさい
    • パーサコンビネータはデバッグが難しい
      • バックトラックがあると難しくなりがち
      • (私怨かもしれない。とはいえ左再帰の自動検出や再帰深度制限ぐらいはしてほしい)
  • もとはこういうのを作ろうとしていた:
    • 実装しやすさ優先
    • 再帰下降方式
    • バックトラックを制限するため、選択のブランチに必ずカットを含めるというルールにしておく
      • 選択のパースでは、カットに到達するまでバックトラックする
  • 調べていたら Typed Algebraic Approach (公開日 2018年7月) という手法が提案されていて興味を持った
    • (背景となるモチベーションはまったく異なる。リンク先を参照)
    • トークンを連接・選択・不動点演算子で合成することで構文を定義する
    • 定義した構文に型検査のようなものをかけることで、構文に曖昧性がないことを検証するらしい
  • せっかくなのでミローネ言語で使えるパーサライブラリを1つ作ろうと思っている

書いた記事

気になった記事

  • How (and why) nextest uses tokio, part 1 :: sunshowers (公開日 2022-10-03)
    • チャネルとスレッドを使った並行処理が煩雑になってきて、それをasync/awaitとasyncランタイム(tokio)を使って再設計したら分かりやすくなったという感じの話
    • 前者 (チャネルとスレッド) は私が作っているLSPサーバーでありがちな構成であり、これを参考に改善するとよいかもしれない

関連記事