core.logicなどのKanren族言語を使ってS式をきれいに出力したい(実験)Niyarin
View Slide
S式をきれいに出力したい割と(自分の中で)需要があったので取り組むことにした・Schemeでマクロの展開結果を綺麗に出力したい・Linter等のツールで綺麗にS式を出力したい出力をある程度プログラマブルに行ないたい・いろいろ書き方は好みがある・インデントを変えたり・オレオレマクロ向けに独自の改行スタイルが欲しいとか?
S式をきれいに出力する方法”ルール”を定義して、その範囲内で出力すればよい例:→ Kanrenなどを使ってこれを実現する・各行は80文字以内・letの束縛部のインデントはそろえる・condのペアグループを空白でわける
Kanrenとは?Logic programming用DSL (Prologみたいなことをする)SchemeのminiKanrenがオリジナル数多くの言語に移植されており、実装がたくさんある・core.logic (Clojure移植版)・microKanren (40行足らずの最低限の実装、Scheme)The reasoned Schemer本もある → (買ったけど全部読んでいない、ごめんなさい)
core.logicの簡単な例xは1と等しい。 xの値は? (当然1)xとyは0,1,2のどれか。xとyは等しくない。xとyの値は?(run* [x] (== x 1)) → (1)(run* [x y](membero x [0 1 2])(membero y [0 1 2])(!= x y))→ ([0 1] [1 0] [0 2] [2 0] [1 2] [2 1])
今回やったこと小さいS式言語にインデントをつけた・vectorで表現されるlispで、定数は、文字列と数値だけ[“list” “hello” 1 2 3]・構文は関数適用だけ→ とはいえ、関数適用はいろいろ書き方がある(fn arg1 arg2 arg3)(fn arg1arg2arg3)(fnarg1arg2arg3)(fn arg1 arg2 arg3 arg4arg5 arg6 arg7 arg8)(fn loooooooooooong-arg1arg2 arg3 arg4 arg5)
与えたルール1. 1行80文字以内2. 引数は、インデント幅2で改行3. OR 引数は、改行して、前の引数と同じ場所4. OR 改行しない(fnarg1)(fn arg1arg2)(fn arg1 arg2)
それっぽく動いた
第一引数に長い引数を与えた80文字ルールに抵触するので、全部に改行が入った
式のネストを増やすと結果が増えすぎたそれほどネストも多くないが...50パターン出てきた
おわりパターン多すぎ、改善が必要だ!出力数を制限する方法はあるが☓ 良い順に整列されていないもうちょっと場合分けをいれると改善できるかも? 極力改行しない + 引数の長さで分けるいずれは、Red-paren (私のlinter)に適用したいおしまい