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'参数访问,但函数享受它们封闭的任何环境)以内嵌式声明协议实现。
...