文字列の反復マクロ

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