2017-05-18 74 views
2

我在Clojure很新。我在Clojure Koans的帮助下学习。我找到了答案与下面的代码:Clojure的功能#(:jerry @%)是什么意思

(= ["Real Jerry" "Bizarro Jerry"] 
     (do 
     (dosync 
      (ref-set the-world {}) 
      (alter the-world assoc :jerry "Real Jerry") 
      (alter bizarro-world assoc :jerry "Bizarro Jerry") 
      (vec (map #(:jerry @%) [the-world bizarro-world])))))) 

来自:https://github.com/viebel/clojure-koans/blob/master/src/koans/16_refs.clj#L42

这是非常不友好的谷歌搜索,如 “Clojure的@%”。所以我从互联网上得不到什么。

它对函数“#(:jerry @%)”有效吗?

而下面的代码是我的答案,但它不起作用。

(= ["Real Jerry" "Bizarro Jerry"] 
     (do 
     (dosync 
      (ref-set the-world {}) 
      (alter the-world assoc :jerry "Real Jerry") 
      (alter bizarro-world assoc :jerry "Bizarro Jerry") 
      (vec (map (fn [x] (:jerry x)) [the-world bizarro-world])) 
     ))) 

回答

8

#(...)reader macro for anonymous function其中%装置传递给函数的第一个参数。例如:

#(println %)

相当于:

(fn [x] (println x))

@reader macro for deref所以再次:

@some-variable

相同:

(deref some-variable)

并用于从ref types之一取消当前值的引用。

#(:jerry @%)因此是当施加到REF匿名函数(例如一个原子)将deref其当前值,并用它作为一个参数调用:jerrykeyword as a function用值。

+1

先生,你真的让我的一天! –

+0

我很高兴能帮到你。 –

0

the-worldbizarro-world是“derefable”,这意味着你可以在前面使用@来获得它们的价值。

您正在使用匿名函数,如#()所示。在匿名函数中,百分号%指示该函数的参数。

所以@%的意思是,“将参数解引用到这个函数。”

:jerry是一个用作函数的关键字,它在地图中获取与密钥:jerry关联的值。

例如:

(def coll [(ref {:jerry 21}) 
      (ref {:jerry 42})]) 
=> #'user/coll 

(map #(:jerry @%) coll) 
=> (21 42)