在让兰博达:第4章cl-ppcre节一书中,实现了一个带有分派字符#~的读取宏,以获得类似于Perl的regex匹配和替换语法。用于实现读-宏的函数是_~_
此函数是使用前面定义的两个宏实现的:
我在想,除了教育目的之外,还有什么需要使用宏来完成上述两项任务呢?我使用简单的函数实现了一个变体:
(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))))然后,我只使用这些函数,而不是相应的宏,它似乎工作得很好。因为这些都是函数,所以不需要双重的准引用,只有一次的宏和其他闪亮的东西,显然比实际程序中的简单函数更难实现和调试。
在这种情况下,宏是否比功能更有好处?这不可能是有效的,因为这些功能最终会在读取阶段(通过读取宏)被调用,因此没有真正的运行成本。
发布于 2015-07-25 15:35:54
我想,他们应该仅仅为了举例而使用宏.因为围绕lambda调用构建cl-ppcre:确实可以在读取阶段完成,前提是读取器宏不使用宏字符后面的字符串以外的任何其他形式。一般来说,金科玉律规定,在可以使用普通函数的情况下,应该避免宏。有时(例如,当需要控制参数的计算时)宏是不可避免的,但是这个特殊的情况函数就足够了。
https://stackoverflow.com/questions/31622106
复制相似问题