2024 Clojure 状态调查! 中分享您的想法。

欢迎!请参阅 关于 页面以了解更多了解其工作方式的信息。

+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 文档字符串中有记录。

我现在明白了!谢谢,以下是任何看到这对他们有帮助的相关评论

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


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

      (id (java.util.Properties.))
      ;; => 42
这个问题是关于deftype/defrecord方法,所以不明白这为什么相关。
通过“extend”附加的方法会对它们的 环境产生影响。因此,您可以选择是在deftype内部以词法方式声明协议实现还是使用extend(在这种情况下,成员只能通过'this'参数访问,但函数将享受它们所闭包的任何环境)。
...