宏观法则对<条码>* 定义*条码>表示进行评价;它符合该表述的源代码,即<条码>* 限制/代码。 页: 1
当争论为<代码>时,“,两者之间的区别因<代码>而消失;是一种自我评价的原子:<代码>的源代码”;和<代码>的操作时间价值”;相同。
如果您的宏观计算参数将不列入扩大范围,但必须加以评价,参数可以是任何表述(不仅如<代码>abc”、42
或(1 2)
(引述名单),则您必须使用<代码>eval。
Let s change your &body
to &rest
because vars
are not a progn
-like body.
还要改变宏观参数的名称,以便提醒我们,它们是表述(来源代码),而不是价值观:
(defmacro format-delimited (stream-expr fmt-expr delimiter-expr &rest var-exprs)
(let ((resulting-fmtstr "")
(incoming-fmt (eval fmt-expr))
(delim (eval delimiter-expr)))
(dotimes (i (length var-exprs))
(setf resulting-fmtstr (concatenate string resulting-fmtstr incoming-fmt delim)))
`(format ,stream-expr ,resulting-fmtstr ,@var-exprs)))
顺便提一下:
> (macroexpand (format-delimited t "~a" ";" 1 2 3))
(FORMAT T "~a;~a;~a;" 1 2 3) ;
T
> (defvar *delimiter* "---")
*DELIMITER*
> (macroexpand (format-delimited t "~a" *delimiter* 1 2 3))
(FORMAT T "~a---~a---~a---" 1 2 3) ;
T
Needless to say, the eval
won t be happening in the apparent lexical environment. That does not exist until run time; at macro-expansion time, we are just processing source code.
The variable being referenced, *delimiter*
will have to exist at macro-expansion time and have the right value.
<代码>format功能可做您之后的重述。 The syntax has a Much of bells and informs. 我不敢肯定,它是否能够篡改描述多种论点的格式,但可以用一个价值清单的论点来做到这一点。
You might be concerned that you don t want the format string to be interpreted at run-time.
普通图书馆有一个称为formatter
的宏观,将格式说明变成代码(功能)。
如果是,
(format stream "whatever" args ...)
页: 1
(format stream (formatter "whatever") args ...)
编辑<代码>。 其结果是一种功能(如lambda
>表述)。 当<代码>format的第二个论点是功能时,它只是从该功能的流体和论据手中。