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

时间:2015-07-25 02:02:06

标签: lambda macros lisp common-lisp

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

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

  • 匹配模式ppcre-λ-形式
  • SUBST模式-ppcre-λ-形式

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

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

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

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

1 个答案:

答案 0 :(得分:2)

我认为,他们应该仅仅为了示例而使用宏...因为在读取阶段构建lambda cl-ppcre:个调用确实可以完成,前提是读者宏没有& #39; t使用宏字符后面的字符串以外的任何其他形式。一般来说,黄金法则规定,在可以使用普通函数的情况下应该避免使用宏。有时(例如,当需要控制参数的评估时)宏是不可避免的,但是这个特殊情况函数就足够了。