Slide 1

Slide 1 text

core.logicなどのKanren族言語を使って S式をきれいに出力したい(実験) Niyarin

Slide 2

Slide 2 text

S式をきれいに出力したい 割と(自分の中で)需要があったので取り組むことにした ・Schemeでマクロの展開結果を綺麗に出力したい ・Linter等のツールで綺麗にS式を出力したい 出力をある程度プログラマブルに行ないたい ・いろいろ書き方は好みがある ・インデントを変えたり ・オレオレマクロ向けに独自の改行スタイルが欲しいとか?

Slide 3

Slide 3 text

S式をきれいに出力する方法 ”ルール”を定義して、その範囲内で出力すればよい 例: → Kanrenなどを使ってこれを実現する ・各行は80文字以内 ・letの束縛部のインデントはそろえる ・condのペアグループを空白でわける

Slide 4

Slide 4 text

Kanrenとは? Logic programming用DSL (Prologみたいなことをする) SchemeのminiKanrenがオリジナル 数多くの言語に移植されており、実装がたくさんある ・core.logic (Clojure移植版) ・microKanren (40行足らずの最低限の実装、Scheme) The reasoned Schemer 本もある →  (買ったけど全部読んでいない、ごめんなさい)

Slide 5

Slide 5 text

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])

Slide 6

Slide 6 text

今回やったこと 小さいS式言語にインデントをつけた ・vectorで表現されるlispで、定数は、文字列と数値だけ [“list” “hello” 1 2 3] ・構文は関数適用だけ → とはいえ、関数適用はいろいろ書き方がある (fn arg1 arg2 arg3) (fn arg1 arg2 arg3) (fn arg1 arg2 arg3) (fn arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8) (fn loooooooooooong-arg1 arg2 arg3 arg4 arg5)

Slide 7

Slide 7 text

与えたルール 1. 1行80文字以内 2. 引数は、インデント幅2で改行 3. OR 引数は、改行して、前の引数と同じ場所 4. OR 改行しない (fn arg1) (fn arg1 arg2) (fn arg1 arg2)

Slide 8

Slide 8 text

それっぽく動いた

Slide 9

Slide 9 text

第一引数に長い引数を与えた 80文字ルールに抵触するので、全部に改行が入った

Slide 10

Slide 10 text

式のネストを増やすと結果が増えすぎた それほどネストも多くないが... 50パターン出てきた

Slide 11

Slide 11 text

おわり パターン多すぎ、改善が必要だ! 出力数を制限する方法はあるが ☓ 良い順に整列されていない もうちょっと場合分けをいれると改善できるかも?   極力改行しない + 引数の長さで分ける いずれは、Red-paren (私のlinter)に適用したい おしまい