λ…

バッククォート怖い…
Let Over Lambdaで紹介されてる例が怖い…

CL-USER> (let ((let '`(let ((let ',let))
,let)))
`(let ((let ',let)) ,let))
(LET ((LET '`(LET ((LET ',LET))
,LET)))
`(LET ((LET ',LET)) ,LET))
CL-USER> (equal + *)
T

確かに処理を追っていけば式とその値が等しいことが分かるけど、
どうやってこんなものを思いついたんだろう…
とりあえずインスパイヤしてみた。

((lambda (lambda)
`((lambda (lambda) ,lambda)
',lambda))
'`((lambda (lambda) ,lambda)
',lambda))

さらに、次の式を評価し、
『(set-macro-character #\λ #'(lambda (stream c) ‘lambda))』
lambdaの代わりにλを使えるようにするとますます気持ち悪い書き方ができる。

((λ (λ)
`((λ (λ) ,λ)
',λ))
'`((λ (λ) ,λ)
',λ))

意味不明すぎてかっこよく見えてきた。

Leave a Reply