clojure - 为什么 next 不是 gensymed?
问题描述
这x
是 gensymned ,因为传递给的某些表达式and
可以包含x
在其中并避免这种冲突。那为什么next
不是gensymed呢?不能next
导致变量捕获?
(defmacro and
([] true)
([x] x)
([x & next]
`(let [and# ~x]
(if and# (and ~@next) and#))))
解决方案
x
不是gensymmed,也不应该是。这里的 gensymmed 是and#
,它是 gensymmed 的常见原因:它是一个合成绑定,引入到调用者的作用域中,用于宏的内部使用。x
并且next
不是这些东西:它们不是作为绑定引入的,也不是用于宏的内部使用。它们是调用者提供的代码片段(一个表单和一个表单序列),旨在为调用者的目的而出现在展开的正文中。
推荐阅读
- python - 使用 Python Lxml 解析静态 html 文件中的隐藏元素
- ios - 无法在核心数据中的 NSManagedObject 子类中存储字符串
- git - 使用 supervisorctl 进行 git pull 时主机密钥验证失败
- php - 删除数组中的随机逗号
- android - Android Studio 修复 BSOD 崩溃中的布局文件
- c++ - C++ 中的快速排序。几乎正确,但结果发生了变化
- html - 调整 svg 元素的大小
- angular - 找不到 Ionic 3 LoadingController removeView
- html - 转发电子邮件模板时图像变大
- azure-active-directory - 具有 Application.ReadWrite.OwnedBy 的 Azure AD 应用无法向其创建的应用添加更多所有者