macros - 口齿不清/克洛朱尔 : Is it a good idea to write function generating macros?

标签 macros clojure lisp metaprogramming

This question要求创建一个 Clojure 宏来生成几个函数。我们想出了一种方法来做到这一点,但被“这是个好主意吗?”的问题所困。

我最初的 react 是不是真的,原因有二

  1. 然后您的代码中有未定义的函数,这会使理解您的代码变得相当复杂! (想象一下,有人对您的某个函数有疑问,查看源代码却找不到任何地方)。
  2. 最好在函数或宏中找出代码的共性。让您的计算机编写一堆非常相似的函数是一种糟糕的方法。

你怎么看?什么时候在 Lisp 中生成函数才有意义?它应该是“即时”的,还是您更愿意将其保存在某个文件中?

最佳答案

关于代码复杂性的提示多年来一直伴随着宏。每个抽象都是为了隐藏复杂性,无论是宏、函数还是其他任何东西。

分解为函数的值(value)在于重用,因为函数比宏更可重用。不仅在能够使用“应用”的情况下,而且在共享代码的字面情况下。共享函数只是指向函数实现的指针。共享和重用的宏会导致函数或代码或其他任何内容的多个副本,虽然存在抽象,但系统内根本不共享代码。

现在,您可以制作一个非常聪明的宏来检查扩展时的函数定义,如果没有找到它,那么它可以即时创建函数,或者做一些其他聪明的事情。

但即使将功能排除在外,它们表面上仍将对用户隐藏,因为这首先是宏背后的基本前提。将这些辅助函数放入某个隐藏的包中不会使消费者更加可见,除非他们知道甚至查看源代码(假设他们甚至拥有源代码)。

理想情况下,开发人员不会对这些功能感兴趣,因为它们“内部没有用户可维修的部件”。如果他们这样做,那么首先宏就不能为这些功能提供足够的支持或文档。

关于macros - 口齿不清/克洛朱尔 : Is it a good idea to write function generating macros?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7854027/

相关文章:

c - 一种计算 __VA_ARGS__ 参数数量(包括 0)的方法,无需编译器特定的构造

在预处理阶段之后但在汇编阶段之前进行编译

performance - 使用 Clojure 宏内联函数

Clojure 中的宏、评估和引用

clojure:给定一个映射列表,获取特定键值的总和值

clojure - 始终加载 clojure 库的最简单方法是什么?

c - printf 中的宏变量替换

lisp - common lisp 在格式之后调用 read-line 会在 Clozure CL 实现中产生额外的换行符

Scheme:COND 在其主体中支持多个表达式的直觉是什么?

emacs - Lisp 交互式 emacs 乘法不正确