準クオート

しょうがないやるか。

>>(let ((x '(1 2 3 4))) `(a x c d))
=>(a x c d)

>>(let ((x '(1 2 3 4))) `(a ,x c d))
=>(a (1 2 3 4) c d)

>>(let ((x '(1 2 3 4))) `(a ,@x c d))
=>(a 1 2 3 4 c d)

>>(let ((x 2)) `(a ,x c d))
=>(a 2 c d)

>>(let ((x 2)) `(1 2 ,(+ x 1) 4))
=>(1 2 3 4)

>>(let ((x 1)) `,x) 
=>1

なるほど!S式版の文字列展開みたいなもんか。R5RSにものってたのか。丸々無視してた。

念願のconsの逆もかけるんだ。

>>(let ((x '(1 2 3)) (y 4)) `(,@x ,y))
=>(1 2 3 4)

>>(let ((x '(1 2 3)) (y 4)) (cons y x))
=>(4 1 2 3)

ほんとはpushみたいな関数あるのかもしれないけど今のところ発見できない。

というわけでいままでの知識を元にクイックソートを書き直した

>>(define qsort (match-lambda (()()) ((x . xs) (receive (l r) (partition (lambda (y) (< y x)) xs) `(,@(qsort l) ,x ,@(qsort r))))))
=>qsort

>>(qsort '(4 3 5 2 5 2 3 4))
=>(2 2 3 3 4 4 5 5)