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
red-paren-scheme-rev-macro.pdf
Search
Niyarin
May 28, 2020
Programming
0
350
red-paren-scheme-rev-macro.pdf
Niyarin
May 28, 2020
Tweet
Share
More Decks by Niyarin
See All by Niyarin
Scheme用nREPLの開発(エラー出力の改善)
niyarin
0
120
bel lispの紹介
niyarin
0
590
nanopass-compiler-frameworkを使ってみました
niyarin
0
350
Gorgos-parser-combinator-written-in-scheme
niyarin
0
320
outputting-beautiful-s-expression
niyarin
0
300
Serialisp
niyarin
1
620
Mongo DBとS式検索
niyarin
0
250
goodbye-python-repl
niyarin
0
270
SchemeのEphemeronとWeak Pairの説明
niyarin
0
800
Other Decks in Programming
See All in Programming
[After Kotlin Fest 2024 LT Night @ Sansan] もっともっとKotlinを好きになる!K2 Compiler Pluginで遊んでみよう!
kitakkun
2
260
CSC307 Lecture 06
javiergs
PRO
0
360
Xcode 16のPreviewModifierと@Previewableを活用した効率的なプレビュー方法の考察
ojun9
2
160
Advanced App Shrinking Techniques
cbeyls
2
150
Clean Architecture by TypeScript & NestJS
ryounasso
0
150
CSC307 Lecture 13
javiergs
PRO
0
150
今こそ始める、CDKコンストラクトライブラリ開発 ― 入門から実践まで
tmokmss
1
930
DynamoDB コスト最適化っぽいことの基本 with Terraform
kuro_kurorrr
2
250
I/O Extended Android in Korea 2024 ~ Whats new in Android development tools
pluu
0
250
CSC307 Lecture 10
javiergs
PRO
0
310
Polarsの成長: v0.14からv1.0までの変遷と今後の展望
zerebom
1
350
Modern Angular: Renovation for Your Applications
manfredsteyer
PRO
0
140
Featured
See All Featured
Imperfection Machines: The Place of Print at Facebook
scottboms
262
13k
Keith and Marios Guide to Fast Websites
keithpitt
408
22k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
12
3.8k
Leading Effective Engineering Teams 2024
addyosmani
3
300
Facilitating Awesome Meetings
lara
46
5.8k
Building Adaptive Systems
keathley
34
2k
A Tale of Four Properties
chriscoyier
155
22k
The World Runs on Bad Software
bkeepers
PRO
63
11k
The Pragmatic Product Professional
lauravandoore
29
6.1k
The Language of Interfaces
destraynor
151
23k
Automating Front-end Workflow
addyosmani
1362
200k
The Illustrated Children's Guide to Kubernetes
chrisshort
39
47k
Transcript
Scheme用Linterの改良 (マクロ逆展開を可能なかぎりやる?) Niyarin
Scheme用Linter、Red-parenについて ◦パターン列挙型のLinter Red-paren (apply append (map some-proc (foo x))) ソースコード
((apply append (map f ls …)) (append-map f ls …)) … 略) パターン(rules+) (append-map some-proc (foo x)) と書けるよ niyarin/red-paren
Red-parenのちょっとした問題 ◦マクロに対して弱い 例) threading macro (ネストした式を平らにする) (->> some-list (filter (λ
(x) (not (some-pred? x))) ) … ) (->> some-list (remove some-pred?) …) と動いてほしい (filter (lambda (x) (not (pred x))) ls) このマクロを使うとremoveのルールにマッチしない removeのルール
マクロが問題になるケースは多いのか? 普通のマクロは問題ない ◦ 問題の原因の多くは手続き適用を壊すマクロ ・ threading macro ・ condp ◦レアケースと思って良さそう(たぶん)
※これらが悪だとは言っていない(私はcondpが好きです)
マクロ展開→ Lint適用 (->> some-list (filter (λ (x) (not (some-pred? x))))
なにか1 なにか2 なにか3) (なにか3 (なにか2 (なにか1 (remove some-pred some-list)))) マクロ展開+Lint ◦ マクロを使うとすり抜けるのでマクロ展開してからLintを書けてみる ☓ これは求めていたものとは違う(ちょっと不親切)
マクロを逆展開する機構が欲しい (->> some-list (remove some-pred) なにか1 なにか2 なにか3) (なにか3 (なにか2
(なにか1 (remove some-pred some-list)))) ◦ マクロを逆展開する操作があれば理想的な指摘コードが得られる マクロ逆展開 前ページの例の続き
syntax-rulesって逆にしても使え”そう” Schemeの標準(R7RS)のマクロシステム ◦ let → lambdaの例 lambda → let も逆からマッチさせることでできそう
(syntax-rules () ((let ((name val) ...) body1 body2 ...) ((lambda (name ...) body1 body2 ...) val ...)))
syntax-rulesって逆にしても使え”そう” そう簡単にはいかない (1) ruleに同じ変数を含んではいけない → これは同じ変数が同じものにマッチしているならよいことにする (2) 2回以上のellipsis → backtrack+最短マッチで妥協する?
(3) ruleだけに存在する変数や_ → あきらめる(ほとんどないケースだと思う) (4) ruleは上からマッチする仕様だが、逆は必ずしもそうではない → 次のページ (5) hygenic性とか先頭がsymbolでないことも目をつぶる
復元できそうなものを全列挙する (->> (a b) c) (->> (->> (a b) c))
(->> b a c) (->> b (a) c) 決定的に出せないので全列挙 → どれか1つが理想的なもの
逆展開例 (->> なにか1なにか2 (なにか3 なにか4) (filter (lambda (x) (not (some-pred?
x)))) なにか5) (->> なにか1 なにか2 (なにか3 なにか4) (remove some-pred?) なにか5) (->> なにか5 (->> (remove some-pred? (なにか3 なにか4 (なにか2 なにか1))))) (->> なにか1 (なにか2) (なにか3 なにか4) (remove some-pred?) なにか5) 理想 不自然なコード(正しく動作はする) 理想と近いが正しく動作しない 元のコード
どのように理想的なコードを見つけるのか 適当な評価式を与えて最もポイントが高いのを選択する ◦ (同じ要素が同じ順序で含む数 , - 最大の深さ , - 式の長さ
) ・一応、threadingマクロ例の理想コードはこれでとれはする 理想:(5 -2 -6) 不自然なコード:(1 -5 -3) 動作しないコード:(4 -2 -6) ・てきとうなので改良はいる
sexp-diffとかもよいかもしれない ・Racket系のs式diff #:newと#:oldを付けて差分が分かる > (sexp-diff '(->> some1 some2 (some3 some4)
(filter (lambda (x) (not (some-pred? x)))) some5) '(->> some1 some2 (some3 some4) (remove some-pred?) some5)) '((->> some1 some2 (some3 some4) #:new (remove some-pred?) #:old (filter (lambda (x) (not (some-pred? x)))) some5))
Red-parenに組み込む ・マクロ情報をユーザが渡さないと使えない → 名前空間からマクロを得る部分が必要 というわけで組み込むのはまだ先 ・マクロ逆展開は実装済み ・信頼性は落ちるのでなんらかのタグをつける
おわり