マクロ 99問 P01 — #:g1

Posted 2011-01-15 10:44:00 GMT

思い付きで作ってみたM-99ですが、果して役に立つのかまったく分からないので自分で問いてみることにしました。
-(http://common-lisp-users.jp/index.cgi?M-99)
時間を計測したら燃えるかと思い時間を測ってみましたが、結果は、52秒。
多分、マクロを書いたことがある方なら1分以内で解けるんじゃないでしょうか。
引数をクォートについてがテーマなのですが、1問目にしては難しいテーマなのかもしれません。

(let ((ut 0))
  (defun start ()
    (setq ut (get-universal-time)))
  (defun check ()
    (- (get-universal-time) ut)))

(start) ;=> 3504076885

;; 与えられた引数を全てQUOTEしてリストとして返すLISTQを作成せよ ;; テーマ:引数のクォート

(listq a b c d e) ≡ (list 'a 'b 'c 'd 'e) ;=> (A B C D E)

(defmacro listq (&rest args) `(list ,@(mapcar (lambda (x) `(quote ,x)) args)))

(check) ;=> 41 ;; テストするの忘れてた…

(listq a b c d) ;=> (A B C D)

(check) ;=> 52

ついでにGaucheでも
;; gauche
(use srfi-19)

(define *ct* 0)

(define (start) (set! *ct* (current-time)) (time-second *ct*)) (define (check) (time-second (time-difference (current-time) *ct*)))

(start) ;=> 1295090821

(define-syntax listq (syntax-rules () ((_) (list)) ((_ arg rest ...) (cons (quote arg) (listq rest ...)))))

(listq a b c d e) ;=> (a b c d e)

(check) 223

(listq) ;=> ()

define-syntaxに慣れてないので使い方間違ったりして223秒かかりました。
ちなみに、Dylanもやってみようかなと思ったのですが、手元の開発環境が動かなくなっておりました…。

comments powered by Disqus