如何解析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? 不是能够解构的主要标准。 例如, setseqable? 但不能解体。 顺序解构的主要标准(不同于联合解构,使用映射,这里不讨论)是nth必须支持它。 在RT.java中,您将看到可能类型的列表。 它们是: CharSequence ,本地Java数组, RandomAccessMatcherMap.EntrySequentialSequential将涵盖最常见的结构:列表和向量)。


更正

正如@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

    上一篇: How to parse nested parameters in a Clojure defn?

    下一篇: clojure defn pattern matching