首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >书中的阅读器

书中的阅读器
EN

Stack Overflow用户
提问于 2015-07-25 02:02:05
回答 1查看 143关注 0票数 4

让兰博达第4章cl-ppcre节一书中,实现了一个带有分派字符#~的读取宏,以获得类似于Perl的regex匹配和替换语法。用于实现读-宏的函数是_~_

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

  • 匹配模式-ppcre-lambda-form
  • 次模-ppcre-lambda-型

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

代码语言:javascript
复制
(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))))

然后,我只使用这些函数,而不是相应的宏,它似乎工作得很好。因为这些都是函数,所以不需要双重的准引用,只有一次的宏和其他闪亮的东西,显然比实际程序中的简单函数更难实现和调试。

在这种情况下,宏是否比功能更有好处?这不可能是有效的,因为这些功能最终会在读取阶段(通过读取宏)被调用,因此没有真正的运行成本。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-25 15:35:54

我想,他们应该仅仅为了举例而使用宏.因为围绕lambda调用构建cl-ppcre:确实可以在读取阶段完成,前提是读取器宏不使用宏字符后面的字符串以外的任何其他形式。一般来说,金科玉律规定,在可以使用普通函数的情况下,应该避免宏。有时(例如,当需要控制参数的计算时)宏是不可避免的,但是这个特殊的情况函数就足够了。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31622106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档