在Clojure中,参数传递是如何工作的?

在Clojure中,参数传递是如何工作的?,clojure,Clojure,我知道在Java中,如果我将一个对象作为参数传递给一个方法,那么该方法将让参数变量指向同一个对象,而不是重复。在Clojure怎么样?例如: (defn print-from-reader [rdr] (print (.read rdr))) (...inside some code... (with-open [rdr (Reader file)] (print-from-rader rdr))) 当rdr传入时,从读卡器打印是否会在内存中创建另一个rdr副本,或者它指向

我知道在Java中,如果我将一个对象作为参数传递给一个方法,那么该方法将让参数变量指向同一个对象,而不是重复。在Clojure怎么样?例如:

(defn print-from-reader [rdr]
   (print (.read rdr)))

(...inside some code...
  (with-open [rdr (Reader file)]
    (print-from-rader rdr)))
当rdr传入时,从读卡器打印是否会在内存中创建另一个rdr副本,或者它指向的是使用开放绑定创建的同一个rdr

有没有办法检查两个clojure实例是否指向同一个内存

很抱歉,我用了“指向”和“实例”等不好的术语,我是Clojure的新手,还在学习。:-)

根据对其传递值的回答

Clojure从Java继承了传递语义的参数。所以它是按值传递的,其中传递的值是一个对象引用。此外,还有一些优化工具,可以传递原语类型的值

因此,传递参数时函数不会复制<代码中的code>rdr将是相同的实例

由于java的互操作性,这样实现它是有意义的——否则您无法(轻松地)用它的方法修改java对象的状态

您可以轻松地测试它:

(import 'java.util.HashMap)
(def m (new HashMap))
(defn foo [m] (defn bar [m] (.put m "testkey" "testvalue")) (bar m) (println (get m "testkey")))

(foo m)
结果:

testvalue
nil

如果
bar
创建了自己的
m
副本,那么
println
将不会打印
bar
内部指定的值Clojure与Java一样是通过值传递的。我认为,引用是按值传递的。 Clojure的工作方式并非如此,Scheme和CommonLisp的行为方式是相同的

您可以使用以下方法测试两个引用是否指向同一内存:

(相同?x y)

测试两个参数是否为同一对象


(一模一样?)看起来很方便,现在我学会了另一个窍门!:-)谢谢你的回答-D