This question要求创建一个 Clojure 宏来生成几个函数。我们想出了一种方法来做到这一点,但被“这是个好主意吗?”的问题所困。
我最初的 react 是不是真的,原因有二
- 然后您的代码中有未定义的函数,这会使理解您的代码变得相当复杂! (想象一下,有人对您的某个函数有疑问,查看源代码却找不到任何地方)。
- 最好在函数或宏中找出代码的共性。让您的计算机编写一堆非常相似的函数是一种糟糕的方法。
你怎么看?什么时候在 Lisp 中生成函数才有意义?它应该是“即时”的,还是您更愿意将其保存在某个文件中?
最佳答案
关于代码复杂性的提示多年来一直伴随着宏。每个抽象都是为了隐藏复杂性,无论是宏、函数还是其他任何东西。
分解为函数的值(value)在于重用,因为函数比宏更可重用。不仅在能够使用“应用”的情况下,而且在共享代码的字面情况下。共享函数只是指向函数实现的指针。共享和重用的宏会导致函数或代码或其他任何内容的多个副本,虽然存在抽象,但系统内根本不共享代码。
现在,您可以制作一个非常聪明的宏来检查扩展时的函数定义,如果没有找到它,那么它可以即时创建函数,或者做一些其他聪明的事情。
但即使将功能排除在外,它们表面上仍将对用户隐藏,因为这首先是宏背后的基本前提。将这些辅助函数放入某个隐藏的包中不会使消费者更加可见,除非他们知道甚至查看源代码(假设他们甚至拥有源代码)。
理想情况下,开发人员不会对这些功能感兴趣,因为它们“内部没有用户可维修的部件”。如果他们这样做,那么首先宏就不能为这些功能提供足够的支持或文档。
关于macros - 口齿不清/克洛朱尔 : Is it a good idea to write function generating macros?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7854027/