cl-ppcre reader 在 let-over-lambda 书中

cl-ppcre reader in let-over-lambda book

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

这个函数是使用前面定义的两个宏实现的:

我想知道,除了教育目的之外,还有什么需要使用宏来完成上述两个任务?我使用简单的函数实现了一个变体:

(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))))

然后我简单地使用了这些函数而不是相应的宏,它似乎工作正常。因为这些是函数,所以不需要双重准引用、一次性宏和其他与实际程序中的简单函数相比显然更难实现和调试的闪亮内容。

在这种特殊情况下,任何好处宏都具有过度功能?这不可能是高效的,因为这些函数最终会在读取阶段(通过读取宏)被调用,因此没有真正的 运行-时间成本。

我认为,他们应该仅仅为了示例而使用宏...因为在阅读阶段确实可以在阅读阶段完成围绕 cl-ppcre: 调用构建 lambda,前提是 reader 宏除了跟在宏字符后面的字符串之外,不使用任何其他形式。一般来说,黄金法则指出,在可以使用普通函数的情况下应避免使用宏。有时(例如,当需要控制参数的计算时)宏是不可避免的,但这个特殊情况下的功能就足够了。