Gaucheクックブックで文字列の反復を取り上げていた。
文字列の反復演算子 (x演算子) - Gaucheクックブック
折角だからこれも syntax-case
版を書いてみることにした。
(define-syntax x (lambda(x) (syntax-case x () ((k str n) (let ((str (syntax->datum #'str))) (datum->syntax #'k (call-with-string-output-port (lambda(p) (do ((i (syntax->datum #'n) (- i 1))) ((zero? i)) (display str p))))))))))
文字列と数字を与えると、文字列を数字の回数分だけくりかえした文字列になる。
(x "foo" 3) ; => "foofoofoo"
マクロなので渡すのは文字列リテラルじゃないとエラーになる。
(define foo "foo") (x foo 3) ;; => Error in string-append: foo is not a string.
このマクロを書いてて思ったのだが、マクロなのに定義の中ではschemeの言語機能をほとんど全て使えるというのがスゴい。C/C++では味わえない全能感である。
Document ID: fc2d95e7adfc9fe050118b9c9dd42d4f