参数如何在Clojure中传递?

Jay*_*don 7 clojure

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

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

(...inside some code...
  (with-open [rdr (Reader file)]
    (print-from-rader rdr)))
Run Code Online (Sandbox Code Playgroud)

当传入rdr时,print-from-reader是否会在内存中创建另一个rdr副本,或者它指向已经通过with-open绑定创建的相同rdr?

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

抱歉我的错误条款,如"指向"和"实例",我是Clojure的新手,仍在学习它.:-)

sou*_*eck 5

根据对Google网上论坛这个问题的回答,它是按值传递的。

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

因此,传递参数时函数不会复制。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)
Run Code Online (Sandbox Code Playgroud)

结果是 :

testvalue
nil
Run Code Online (Sandbox Code Playgroud)

如果bar创建自己的副本m,那么println不会打印内部分配的值bar


Nat*_*hes 5

Clojure就像Java一样传递价值.我认为它是,引用是通过值传递的.Clojure不像这样工作,Scheme和Common Lisp的行为方式相同.

您可以测试两个引用是否指向同一个内存identical?:

(相同?xy)

测试2个参数是否是同一个对象