cl-ppcre阅读器在let-over-lambda书中


Let Over Lambda
Chapter-4 cl-ppcre section一书中,实现了一个带有调度字符#〜的读取宏,以获得类似于Perl的正则表达式匹配和替换语法.用于实现读取宏的函数是|#〜-reader |.

使用前面定义的两个宏实现此功能:

> match-mode-ppcre-lambda-form
> subst-mode-ppcre-lambda-form

我想知道,除了教育目的,在上述两项任务中使用宏需要什么?我使用简单的函数实现了一个变体:

(defun match-mode-alt (args)
  `(lambda (x) (cl-ppcre:scan ,(car args) x)))

(defun subst-mode-alt (args)
  `(lambda (x) (cl-ppcre:regex-replace-all ,(car args)
                                           x
                                           ,(cadr args))))

然后我只是使用这些函数而不是相应的宏,它似乎工作正常.因为这些是函数,所以与实际程序中的简单函数相比,不需要双quasiquote,一次性宏和其他闪亮的东西,这些东西显然更难实现和调试.

在这种特殊情况下,任何有益的宏都有功能吗?它不能提高效率,因为这些功能最终会在读取阶段(通过读取宏)被调用,因此没有真正的运行时成本.

最佳答案 我认为,他们应该仅仅为了举例而使用宏…因为在cl-ppcre周围构建lambda:调用确实可以在阅读阶段完成,只要读者宏不使用任何其他形式比字符串,宏字符后面的字符串.一般来说,黄金法则规定,在可以使用普通函数的情况下应该避免使用宏.有时(例如,当需要控制参数的评估时)宏是不可避免的,但是这个特殊情况函数就足够了.

点赞