マクロに現れるprogn

気になるけど、気にするだけ無駄なんだよね。ということの確認。

(defmacro nprogn (num &rest body)
  (nprogn-f (1- num) `(progn ,@body)))

(defun nprogn-f (num body)
  (if (plusp num)
	  (list 'let nil (nprogn-f (1- num) body))
	body))

(macroexpand '(nprogn 5 nil))
|
(progn (progn (progn (progn (progn nil)))))

(defun f ()
  (nprogn 1000 nil))
;注)大きくしすぎるとスタックオーバーフローを起こす。

(time (f))
Real time: 0.0 sec.
Run time: 0.0 sec.
Space: 0 Bytes
;CLISPの場合