準クオート
しょうがないやるか。
>>(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)