optimization - 是否有可能/使用卫生宏进行编译时计算优化的例子有哪些?
问题描述
我一直在阅读https://lispcast.com/when-to-use-a-macro,它指出(关于 clojure 的宏)
另一个例子是在编译时执行昂贵的计算作为优化
我抬头一看,clojure 似乎有不卫生的宏。这也可以应用于卫生的吗?特别是谈到Scheme。据我了解卫生宏,它们只转换语法,但无论如何代码的实际执行都会推迟到运行时。
解决方案
是的。 宏卫生只是指宏扩展是否会意外捕获标识符。无论宏是否卫生,常规宏扩展(与阅读器宏扩展相反)发生在编译时。宏扩展用宏的执行结果替换宏的代码。它们的两个主要用例是转换语法(即 DSL),通过消除运行时计算来提高性能或两者兼而有之。
想到几个例子:
- 您更喜欢以度数为单位编写代码,但所有计算实际上都是以弧度为单位的。您可以让宏在编译时消除这些微不足道但不必要的(在运行时)转换。
- 记忆化是宏可用于计算优化的一个广泛示例。
- 您有一个表示 SQL 语句或复杂的文本数学表达式的字符串,您希望对其进行解析,甚至可能在编译时执行。
您还可以结合这些示例并拥有一个记忆 SQL 解析器。几乎所有在编译时拥有所有必要输入并因此可以计算结果的场景都是候选方案。
推荐阅读
- python - pytorch 自定义数据集:DataLoader 返回张量列表而不是列表的张量
- mergesort - 我正在尝试在 python 中编写合并排序,但是当我输入不同的列表时输出不同
- sas - SAS 中的配对条形图
- outlook - 如何在 Outlook 插件中添加导航按钮?
- apache - Apache 未正确加载文档根目录
- flutter - 如何检查键盘是否可见?
- aframe - 在框架中检测 Quest 上的 VR 功能
- spring - 无法在 ignite 中创建客户端-服务器连接
- c++ - 关于 `std::vector::push_back` 的声明的选择
- html - 在 HTML 表单中,标签的目标是输入的名称还是 id?