by shigemk2

当面は技術的なことしか書かない

マクロ定義を拡張する

;; defmacroではリスト分解機能はない
(defmacro for2 (spec &rest body)
  (declare (indent 1))
  (let ((limit (gensym)))
    (destructuring-bind (var start end) spec
      `(let ((,var ,start)
	     (,limit ,end))
	 (while (<= ,var ,limit)
	   ,@body
	   (setq ,var (1+ ,var)))))))
(with-output-to-string
  (for2 (i 1 2)
    (princ i)))				; => "12"
;; defmacro*ではリスト分解機能がある
(defmacro* for3 ((var start end) &rest body)
  (declare (indent 1))
  (let ((limit (gensym)))
    `(let ((,var ,start)
	   (,limit ,end))
       (while (<= ,var ,limit)
	 ,@body
	 (setq ,var (1+ ,var))))))
(with-output-to-string
  (for3 (i 1 2)
    (princ i)))				; => "12"

P194

Emacs Lispテクニックバイブル

Emacs Lispテクニックバイブル