文字列の反復マクロ

Gaucheクックブックで文字列の反復を取り上げていた。
id:rui314:20070416:p1
折角だからこれもsyntax-case版を書いてみることにした。

(define-syntax x
  (lambda(x)
    (let f ((x x))
      (syntax-case x ()
        ((_ str 1)
         (syntax str))
        ((_ str n)
         (with-syntax
             ((m (datum->syntax-object (syntax k)
                   (- (syntax-object->datum (syntax n)) 1))))
           (with-syntax
               ((n (string-append
                    (syntax-object->datum (syntax str))
                    (syntax-object->datum (f (syntax (_ str m)))))))
             (syntax n))))))))

文字列と数字を与えると、文字列を数字の回数分だけくりかえした文字列になる。

(x "foo" 3)  ; => "foofoofoo"

マクロなので渡すのは文字列リテラルか、文字列リテラルに展開されるマクロじゃないとエラーになる。

(define foo "foo")
(x foo 3) ;; => Error in string-append: foo is not a string.
          ;;    Type (debug) to enter the debugger.

このマクロを書いてて思ったのだが、マクロなのに定義の中ではschemeの言語機能をほとんど全て使えるというのがスゴい。C/C++では味わえない全能感である。
Document ID: fc2d95e7adfc9fe050118b9c9dd42d4f