Upgrade to Pro — share decks privately, control downloads, hide ads and more …

outputting-beautiful-s-expression

Niyarin
October 29, 2020

 outputting-beautiful-s-expression

Niyarin

October 29, 2020
Tweet

More Decks by Niyarin

Other Decks in Programming

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  6. 今回やったこと
    小さい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)

    View Slide

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

    View Slide

  8. それっぽく動いた

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide