Macros Lisp-“;案例;宏实现

Macros Lisp-“;案例;宏实现,macros,lisp,Macros,Lisp,我想知道case宏是如何工作的,但仅仅扩展它是不够的。它如何在不知道有多少参数的情况下生成cond语句?它是用环还是什么的?如果是这样的话,为什么在我运行macroexpand时它不显示呢 我需要以类似的方式编写一些东西,这就是我为什么要问的原因。是的,您需要使用迭代-循环、执行、映射卡(或递归)中的一种 看一看,例如: 为什么不看看您最喜欢的实现的源代码呢?请注意,一些递归方法对此并不明确。例如,case可以扩展为一个if,它检查第一个case,将else部分保留为(case…)。宏定义不会显

我想知道case宏是如何工作的,但仅仅扩展它是不够的。它如何在不知道有多少参数的情况下生成cond语句?它是用环还是什么的?如果是这样的话,为什么在我运行macroexpand时它不显示呢


我需要以类似的方式编写一些东西,这就是我为什么要问的原因。

是的,您需要使用迭代-循环、执行、映射卡(或递归)中的一种

看一看,例如:


为什么不看看您最喜欢的实现的源代码呢?请注意,一些递归方法对此并不明确。例如,
case
可以扩展为一个
if
,它检查第一个case,将else部分保留为
(case…
)。宏定义不会显式递归。
(defun case-expand (whole-form form-name test keyform clauses)
  (let ((var (gensym (string-concat (symbol-name form-name) "-KEY-"))))
    `(let ((,var ,keyform))
      (cond
        ,@(maplist
           #'(lambda (remaining-clauses)
               (let ((clause (first remaining-clauses))
                     (remaining-clauses (rest remaining-clauses)))
                 (unless (consp clause)
                   (error-of-type 'source-program-error
                     :form whole-form
                     :detail clause
                     (TEXT "~S: missing key list")
                     form-name))
                 (let ((keys (first clause)))
                   `(,(cond ((or (eq keys 'T) (eq keys 'OTHERWISE))
                             (if remaining-clauses
                                 (error-of-type 'source-program-error
                                   :form whole-form
                                   :detail clause
                                   (TEXT "~S: the ~S clause must be the last one")
                                   form-name keys)
                                 't))
                            ((listp keys)
                             `(or ,@(mapcar #'(lambda (key)
                                                `(,test ,var ',key))
                                            keys)))
                            (t `(,test ,var ',keys)))
                     ,@(rest clause)))))
           clauses)))))

(defmacro case (&whole whole-form
                keyform &body clauses)
  (case-expand whole-form 'case 'eql keyform clauses))