如何解析Clojure定义中的嵌套参数?
我正在浏览一些Clojure源代码并碰到这个函数:
(defn draw-mask [app-state [r c]]
(let [x1 (+ 25 (* c 50))
y1 (+ 25 (* r 50))]
[:circle {:cx x1 :cy y1 :r 12 :fill "white"}]))
我不明白的是如何解析[app-state [rc]]
。 一个典型的数据结构会传递给它什么,以及如何将它打包出去。 在clojure文档中任何引用都会被赞赏,特别是因为ClojureDocs.org对这个主题没有任何帮助。
你的例子中的函数draw-mask
需要两个参数。 第一个是app-state
,它不在代码中使用,第二个可以是几种不同类型的数据之一:来自地图,字符串,列表或最常见的矢量的值。 您可以在这里看到可以在clojure代码中的nthFrom
中使用的不同类型。
这被称为顺序解构,正如上面提到的其他评论一样,这是一个很大的话题。 然而,对于你的情况,这是它的工作原理:
(draw-mask xyz [3 9]) ---> In draw-mask, r is 3, and c is 9.
(draw-mask xyz [3]) ---> In draw-mask, r is 3, and c is nil.
(draw-mask xyz [3 9 12]) ---> In draw-mask, r is 3, and c is 9 -- 12 is not bound
在此澄清一下:是否可以搜索结构seqable?
不是能够解构的主要标准。 例如, set
是seqable?
但不能解体。 顺序解构的主要标准(不同于联合解构,使用映射,这里不讨论)是nth
必须支持它。 在RT.java中,您将看到可能类型的列表。 它们是: CharSequence
,本地Java数组, RandomAccess
, Matcher
, Map.Entry
和Sequential
( Sequential
将涵盖最常见的结构:列表和向量)。
更正
正如@Josh所指出的那样,顺序解构需要nth
工作:seqability是不够的。
这是顺序解构的一个简单例子。 让我们使用一个显示发生了什么的函数:
(defn foo [app-state [r c]]
{:app-state app-state, :r r, :c c})
app-state
可以是任何东西。 [rc]
必须是nth
适用的序列。 然后 r
是它的first
元素,而 c
是第二个。 nil
。 例子:
(foo 1 ())
;{:app-state 1, :r nil, :c nil}
(foo inc "hello, world!")
;{:app-state #<core$inc clojure.core$inc@32d23c2f>, :r h, :c e}
(foo :one [:two :three :four])
;{:app-state :one, :r :two, :c :three}
(foo "Flubalub" (drop 5 (iterate #(* 10 %) 1)))
;{:app-state "Flubalub", :r 100000, :c 1000000}
但
(foo 99 #{1 2})
;java.lang.UnsupportedOperationException: nth not supported on this type: PersistentHashSet
; ...
链接地址: http://www.djcxy.com/p/82579.html