Clojure 2024 调查问卷 中分享您的想法!

欢迎!请访问 关于 页面了解更多信息。

+1
Clojure

你好!我不确定这是否是一个错误,所以我在这里报告并询问:“这是预期的吗?”

似乎 defrecorddeftype 表达式无法访问其词法闭包中的绑定。以下两个类型声明在 Clojure 1.10.1 中失败,返回 “无法在当前上下文中解析符号:x”。

(defprotocol ID
  (id [x] x))

(let [x 10]
  (deftype TType []
    ID
    (id [_] x)))

(let [x 10]
  (defrecord TRecord []
    ID
    (id [_] x)))

谢谢!

1 答案

0

被选择
 
最佳回答

这是预期的,不是错误 - 在 deftype 文档字符串中有说明。

我明白了!谢谢,以下是这条路的任何人都能看到的相关评论

请注意,方法体不是闭包,局部环境只包括命名的字段,可以直接访问这些字段。
by
然而


    (defprotocol ID)
        (id [x] x))
    
      (let [x 42)
         f (fn [_] x)]
        (extend
         java.util.Properties
          ID
          {:id f}))

      (id (java.util.Properties.))
      ;; => 42
by
这个问题是关于 deftype/defrecord 方法的,所以不清楚为什么这与此相关。
by
通过 "extend" 添加的方法会封闭它们的 环境。因此,您可以决定是否在 deftype 中按词汇表声明协议实现(在这种情况下,类型的成员位于方法的环境中),或者使用 extend(在这种情况下,成员只能通过 'this' 参数访问,但函数享有它们封闭的任何环境)。
...