Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Clojure中,如何更改(def)函数中的变量值_Clojure - Fatal编程技术网

在Clojure中,如何更改(def)函数中的变量值

在Clojure中,如何更改(def)函数中的变量值,clojure,Clojure,所以,我刚刚开始学习Clojure,现在我面临一个无法用谷歌搜索自己的问题 这是我的代码: => (def a "asd") => a "asd" => (defn bla [entry_value] (def entry_value "qwe")) => (bla a) #'exercise.core/entry_value => a "asd" => entry_value "qwe" 我真正想要的是a将的“qwe”作为价值。 可能吗 谢谢你的帮助 是的

所以,我刚刚开始学习Clojure,现在我面临一个无法用谷歌搜索自己的问题

这是我的代码:

=> (def a "asd")
=> a
"asd"
=> (defn bla [entry_value] (def entry_value "qwe"))
=> (bla a)
#'exercise.core/entry_value
=> a
"asd"
=> entry_value
"qwe"
我真正想要的是a的“qwe”作为价值。 可能吗


谢谢你的帮助

是的,从技术上讲,借助这样的功能是可能的

=> (defn bla [entry-value] (alter-var-root entry-value (fn [_] "qwe")))
=> #'user/bla
=> (def a "asd")
=> #'user/a
=> (bla #'a)
=> "qwe"
=> a
=> "qwe"
但这不是在Clojure中VAR(定义为
def
)的工作方式
def
用于在Clojure中声明绑定,而不是变量。绑定意味着将某个值绑定到某个名称,并且该名称在将来不会更改,例如,该绑定是不可变的。程序中的其他函数可能依赖于该不变性,因此请不要使用
alter var root
或其他方法来更改代码中的绑定

如果您确实需要某种状态可变的变量,请使用
atoms

我鼓励你阅读其中包含关于这个主题的非常好和简洁的解释

关于“使用def命名值”部分下的def

讨论了原子、VAR和状态管理


另外,您可以使用来测试上面的代码。

是的,从技术上讲,有了这样的函数的帮助,这是可能的

=> (defn bla [entry-value] (alter-var-root entry-value (fn [_] "qwe")))
=> #'user/bla
=> (def a "asd")
=> #'user/a
=> (bla #'a)
=> "qwe"
=> a
=> "qwe"
但这不是在Clojure中VAR(定义为
def
)的工作方式
def
用于在Clojure中声明绑定,而不是变量。绑定意味着将某个值绑定到某个名称,并且该名称在将来不会更改,例如,该绑定是不可变的。程序中的其他函数可能依赖于该不变性,因此请不要使用
alter var root
或其他方法来更改代码中的绑定

如果您确实需要某种状态可变的变量,请使用
atoms

我鼓励你阅读其中包含关于这个主题的非常好和简洁的解释

关于“使用def命名值”部分下的def

讨论了原子、VAR和状态管理

另外,您可以使用测试上述代码。

如果所讨论的var以前是
def
(声明的)
dynamic
,那么您可以使用新值对其进行渲染,比如说[暂时性地|保持不变性],如下所示: 编辑:例如引用

另外,如果所讨论的var以前是
def
(声明)
dynamic
,您可以让它获得,比如说[暂时性地|保持不变性]以新值呈现,如下所示: 编辑:例如引用


var
是此作业的错误工具。改用
atom
。因此,
(defa(atom“asd”))
(defn bla[var](reset!var“qwe”))
…因此,一个告诉您如何将引用传递到var本身的答案是可能的,但它会建议您编写错误的实践代码。如果你想知道如何把它作为一个练习,那是一件事,但是如果这是你在实际代码中遵循的模式,那就不要去做。
var
def
所做的事情——所以即使更新了变量名,你仍然在尝试编写一个重新定义var的函数,这是一组惯用代码所不能做的事情(有很好的理由——更新变量涉及到锁定、f/e和一些编译时优化,这实际上是不可能的;原子有更合理的性能保证)。你所做的被称为副作用,在函数式语言中,您应该尽量避免副作用。从函数返回新值更为惯用。当来自命令式范例时,这是一个常见的错误。@GuiFGDeo,…对--如果您想重新绑定一个由var引用的值,请使用一个
atom
,正如我在第一条注释中所示。。。但是尝试将计算新值的逻辑与分配值的代码分开;最好有一个
(defn my func[旧值]“qwe”)
并调用
(swap!a my func)
,而不是调用
(my func a)
(如果
a
是一个原子)。
var
是此作业的错误工具。改用
atom
。因此,
(defa(atom“asd”))
(defn bla[var](reset!var“qwe”))
…因此,一个告诉您如何将引用传递到var本身的答案是可能的,但它会建议您编写错误的实践代码。如果你想知道如何把它作为一个练习,那是一件事,但是如果这是你在实际代码中遵循的模式,那就不要去做。
var
def
所做的事情——所以即使更新了变量名,你仍然在尝试编写一个重新定义var的函数,这是一组惯用代码所不能做的事情(有很好的理由——更新变量涉及到锁定、f/e和一些编译时优化,这实际上是不可能的;原子有更合理的性能保证)。你所做的被称为副作用,在函数式语言中,您应该尽量避免副作用。从函数返回新值更为惯用。当来自命令式范例时,这是一个常见的错误。@GuiFGDeo,…对--如果您想重新绑定一个由var引用的值,请使用一个
atom
,正如我在第一条注释中所示。。。但是尝试将计算新值的逻辑与分配值的代码分开;最好有一个
(defn my func[旧值]“qwe”)
并调用
(swap!a my func)
,而不是调用
(my func a)
(如果
a
是一个原子)。谢谢安东的清晰解释。我真的会看看你的链接!谢谢谢谢你的解释,安东。我真的会看看你的链接!谢谢