近況 2021-06-30

今月の活動 (ミローネ言語、LALRとreturn式、HSP3アナライザミニ、hsp3-debug-window-adapter、行分割DPと禁則処理、ブログテーマの改修など)

ミローネ言語

https://github.com/vain0x/milone-lang

milone run

run サブコマンドを追加した。 ミローネ言語で書かれたコードを手軽に動かせるようにするため。 (dotnetcargo にもあるやつ。)

仕組みは単純で、コンパイルと実行をまとめただけ。コンパイル結果であるCのコードと、ビルドスクリプトを一時ディレクトリに書き込んでから ninja && ./<生成したexe> を実行する。

実装の一部はCの標準ライブラリの範囲ではできなさそうだった。 具体的には「一時ディレクトリがなかったら作る」という挙動と、サブプロセスを起動する挙動。 そのため、Linuxのmkdir関数とexecv関数を使った。 Windowsでは動かない。できれば動くようにしたい……

脆弱なビルドチェイン

ビルドスクリプトが壊れているのがつらい。更新されるべきファイルが更新されないとか、何度実行してもdirtyのままになるとか。

LALRの衝突

https://twitter.com/vain0x/status/1408061981970468868

  • パーサジェネレータを使ったことがなかったので、Rustのlalrpopを試していた
  • いつもどおりRust風の構文のパーサを書いていたら、return式の定義が衝突してしまった

文法はこんな感じ:

atom =
    ident
    | "(" expr ")"
    | "return" expr?

mul =
    atom
    | mul "*" atom
    | mul "/" atom

add =
    mul
    | add "+" mul
    | add "-" mul

expr = add

(LALRだから左再帰でもOK)

return a + b(return a) + b なのか return (a + b) なのか曖昧だと指摘されてしまう。

HSP3アナライザーミニ

https://github.com/vain0x/hsp3-ginger/tree/0e6734b1798971ab35e928100a64c87413eec01c/hsp3-analyzer-mini

  • プレリリースとしてvsixの公開をしてみた (v0.3.1)
  • 挙動はそれなりに安定している
  • ホバーとシグネチャヘルプがうるさい気がする

hsp3-debug-window-adapter

https://github.com/vain0x/hsp3-ginger/tree/0e6734b1798971ab35e928100a64c87413eec01c/hsp3-debug-window-adapter

  • F5を押してもデバッグできない (launch.jsonを作る必要がある) 現象が報告されたので調査した
    • 忘れてたけど以前からそうだった
  • 設定ファイルにミスがあったせい
  • contributes.debuggers[].languages にデバッグの対象となる言語を書いておく必要があった

行分割アルゴリズムをかじった

  • 状況: PDFに文字列を描画する機能を作っていた
  • 単語を矩形内に適度に配置したり、長い文章を矩形に収めたりする必要があった
  • 行分割アルゴリズムや禁則処理について調べた
    • 行分割は、単語数に対して線形時間でできるらしいけど、2乗のオーダーでよければ典型的なDPでできた
    • 禁則処理は、間に改行が入らないような文字を1単語として分割するだけだった

参考: Line breaking — Xxyxyz

ブログのテーマ

  • このブログのテーマ (デザイン) を更新した
  • コードのシンタックスハイライトがみづらかった
  • フォントが小さいとか、引用ブロックがイタリックにならないようにするとか、コントラストを上げる (灰色を白や黒に近づける) とか、細かいところを調整した
  • h2 (見出し) の上に空白をつけて文章構造を分かりやすくした
  • 本文の右端の折り返しが分かりづらかったので、両端にボーダーをつけようとしたけど、不格好なのでやめた
    • この記事のように箇条書きの途中に改行があると、文が途中で切れているようにみえる
    • 本文の外側の背景を灰色にするのは、構造的に厳しそうだった
    • 代わりというわけではないけど、テキストの割りつけ(text-justify)を使って右端が縦に揃うようにしてみた
    • マシになった(?)

その他

関連記事