gpt4 book ai didi

data-structures - 了解 Clojure 中的变量

转载 作者:行者123 更新时间:2023-12-04 06:58:15 24 4
gpt4 key购买 nike

我是 Clojure 的新手,我很难理解以下代码在幕后发生的事情:

; Associate the symbol 'fruits to the value ["apple" "banana"]
(def fruits ["apple" "banana"]) ; returns the var #'user/fruits
(count fruits) ; returns 2

(def fruits ["cherry" "orange" "grapes"]) ; returns the var #'user/fruits
(count fruits) ; returns 3
  1. 是否每个“def”形式都返回一个名为#'user/fruits 的新 var 数据结构?
  2. 似乎符号 'fruits 在每个“def”形式之后都绑定(bind)到不同的 var - 这是因为表示绑定(bind)的任何结构都是可变数据结构吗?

最佳答案

对于您的第一个问题:不,它实际上是在更改 Var fruits 中包含的值而不是创建一个新值:

 user> (let [old-fruits #'fruits] 
(def fruits ["cherry" "orange" "grapes"])
(identical? old-fruits #'fruits))
true

如果我们保存对水果 Var 的引用(#' 是引用 Var 本身的简写,而不是其内容)然后重新定义它,identical? 函数告诉我们这些是相同的对象。

对于第二个问题:命名空间是一种将符号映射到变量的可变数据结构。它们不是持久的,因为 Clojure 的其余数据结构是,并且是就地更新的。值得注意的是,变量和命名空间是完全不同的东西。虽然 namespace 提供名称查找并通常将名称解析为变量,但它们本身与变量无关。您可以将变量存储在任何您喜欢的地方,严格来说您不必使用 namespace 来跟踪您的变量。 Vars 还提供了比 namespace 更多的功能(或至少是不同的功能)。它们具有每线程绑定(bind),因此您可以在一个线程上安全地将 var 绑定(bind) 为新值,而不会影响其他线程。

关于data-structures - 了解 Clojure 中的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21388098/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com