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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Niyarin
May 28, 2020
Programming
460
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
red-paren-scheme-rev-macro.pdf
Niyarin
May 28, 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
outputting-beautiful-s-expression
niyarin
0
420
Serialisp
niyarin
1
730
Mongo DBとS式検索
niyarin
0
360
goodbye-python-repl
niyarin
0
390
SchemeのEphemeronとWeak Pairの説明
niyarin
0
1.1k
Other Decks in Programming
See All in Programming
Contextとはなにか
chiroruxx
1
390
そのテスト、説明できますか?~LWテスト戦略FW~のご紹介
nakahara
0
200
Even G2とAWSで推しのエージェントを召喚しよう!
har1101
1
160
エンジニア向け会社紹介/Findy Company Profile
findyinc
6
360k
【やさしく解説 設計編・中級 #1】一つの車に、運転手は一人 ~ある倉庫システムの事例から~
panda728
PRO
0
150
Embedded SREと共に達成した会員管理システムのAWS移行 - SRE NEXT 2026 ランチスポンサーセッション
niftycorp
PRO
1
2.3k
20260623_Loop Engineeringで自分の分身の問い合わせBotを作る
ryugen04
0
200
鹿野さんに聞く!『TypeScriptコードレシピ集』で磨く実践力
tonkotsuboy_com
4
1.1k
吝嗇家のためのAI活用 / AI development for miser - ChatGPT + Issue Driven Development
tooppoo
0
180
スマートグラスで並列バイブコーディング
hyshu
0
290
共通化で考えるべきは、実装より公開する型だった
codeegg
0
200
OSINT for SRE: 学術論文とポストモーテムから探る システム障害の共通パターン / SRE NEXT 2026
tomoyk
1
3.4k
Featured
See All Featured
Navigating Weather and Climate Data
rabernat
0
310
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.2k
WENDY [Excerpt]
tessaabrams
11
38k
Paper Plane
katiecoart
PRO
2
52k
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
300
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
210
How to build a perfect <img>
jonoalderson
1
5.8k
Typedesign – Prime Four
hannesfritz
42
3.1k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
How to Talk to Developers About Accessibility
jct
2
320
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
Designing Experiences People Love
moore
143
24k
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に組み込む ・マクロ情報をユーザが渡さないと使えない → 名前空間からマクロを得る部分が必要 というわけで組み込むのはまだ先 ・マクロ逆展開は実装済み ・信頼性は落ちるのでなんらかのタグをつける
おわり