首页 > 解决方案 > 是否有可能/使用卫生宏进行编译时计算优化的例子有哪些?

问题描述

我一直在阅读https://lispcast.com/when-to-use-a-macro,它指出(关于 clojure 的宏)

另一个例子是在编译时执行昂贵的计算作为优化

我抬头一看,clojure 似乎有不卫生的宏。这也可以应用于卫生的吗?特别是谈到Scheme。据我了解卫生宏,它们只转换语法,但无论如何代码的实际执行都会推迟到运行时。

标签: optimizationmacrosschemelisp

解决方案


是的。 宏卫生只是指宏扩展是否会意外捕获标识符。无论宏是否卫生,常规宏扩展(与阅读器宏扩展相反)发生在编译时。宏扩展用宏的执行结果替换宏的代码。它们的两个主要用例是转换语法(即 DSL),通过消除运行时计算来提高性能或两者兼而有之。

想到几个例子:

  1. 您更喜欢以度数为单位编写代码,但所有计算实际上都是以弧度为单位的。您可以让宏在编译时消除这些微不足道但不必要的(在运行时)转换。
  2. 记忆化是宏可用于计算优化的一个广泛示例。
  3. 您有一个表示 SQL 语句或复杂的文本数学表达式的字符串,您希望对其进行解析,甚至可能在编译时执行。

您还可以结合这些示例并拥有一个记忆 SQL 解析器。几乎所有在编译时拥有所有必要输入并因此可以计算结果的场景都是候选方案。


推荐阅读