Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
outputting-beautiful-s-expression
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Niyarin
October 29, 2020
Programming
420
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
outputting-beautiful-s-expression
Niyarin
October 29, 2020
More Decks by Niyarin
See All by Niyarin
Scheme用nREPLの開発(エラー出力の改善)
niyarin
0
190
bel lispの紹介
niyarin
0
790
nanopass-compiler-frameworkを使ってみました
niyarin
0
490
Gorgos-parser-combinator-written-in-scheme
niyarin
0
420
Serialisp
niyarin
1
740
Mongo DBとS式検索
niyarin
0
360
goodbye-python-repl
niyarin
0
400
SchemeのEphemeronとWeak Pairの説明
niyarin
0
1.1k
red-paren-scheme-rev-macro.pdf
niyarin
0
460
Other Decks in Programming
See All in Programming
freee が目指す データ マネジメント戦略 AI-Ready 時代を支える 攻めのガバナンスとは
freee
PRO
0
320
言語を使う側から、作る側へ。 自作 Lisp で得た新たな気づき。
andpad
0
160
yield再入門 #phpcon
o0h
PRO
0
1k
<title><a id="</title>君はこのHTMLをパースできるか"></a></title> #雑LT_study
pizzacat83
0
140
5分で問診!Composer セキュリティ健康診断
codmoninc
0
930
php-fpmのプロセスが枯渇した日-調査・対処・そして本当にやるべきだったこと-
shibuchaaaan
0
250
【QA Test Talk Vol.8】AI-DLC による Whole Team Approach の加速
pkshadeck
PRO
0
140
Lean は証明の正しさを確認するためだけのツールって思ってませんか?
inoueasei
1
150
Built Our Own Background Agent at LayerX
layerx
PRO
9
5.1k
仕様駆動開発の消費期限
watany
19
7.6k
torikago - Ruby::Boxで照らすモジュラモノリスの実行境界
se4weed
1
350
SlackアプリとLambdaの 連携を構築した話
pawn_4_s
1
110
Featured
See All Featured
KATA
mclloyd
PRO
35
15k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
270
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
450
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
480
sira's awesome portfolio website redesign presentation
elsirapls
0
320
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
450
How STYLIGHT went responsive
nonsquared
100
6.2k
What's in a price? How to price your products and services
michaelherold
247
13k
ラッコキーワード サービス紹介資料
rakko
1
4.3M
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.1k
Transcript
core.logicなどのKanren族言語を使って S式をきれいに出力したい(実験) Niyarin
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 arg1 arg2 arg3) (fn arg1 arg2 arg3) (fn arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8) (fn loooooooooooong-arg1 arg2 arg3 arg4 arg5)
与えたルール 1. 1行80文字以内 2. 引数は、インデント幅2で改行 3. OR 引数は、改行して、前の引数と同じ場所 4. OR
改行しない (fn arg1) (fn arg1 arg2) (fn arg1 arg2)
それっぽく動いた
第一引数に長い引数を与えた 80文字ルールに抵触するので、全部に改行が入った
式のネストを増やすと結果が増えすぎた それほどネストも多くないが... 50パターン出てきた
おわり パターン多すぎ、改善が必要だ! 出力数を制限する方法はあるが ☓ 良い順に整列されていない もうちょっと場合分けをいれると改善できるかも? 極力改行しない + 引数の長さで分ける
いずれは、Red-paren (私のlinter)に適用したい おしまい