Clojure的caddr

Chi*_*ron 11 lisp jvm clojure

在Clojure中,Lisp的caddr相当于什么?

dno*_*len 21

Lisps中的caddr通常以相当于解构的方式使用.Clojure无法支持解构,因此caddr的用处不大.

  (let [[_ _ x] [1 2 3 4]]
    x) ;; -> 3
Run Code Online (Sandbox Code Playgroud)

编辑:回应@ 4bu3li.

(defn describe-path [[first :as edge]] 
  `(there is a ~(last edge) going ~first from here.))
Run Code Online (Sandbox Code Playgroud)

没有办法指定w/destruct的最后一个元素,但这与原始问题无关.

  • @Hamish Grubijian:嗯,任何seq至少与绑定列表中的元素一样多.如果序列是"[1 2]",那么`x`将为零,因为没有第三项. (2认同)

seh*_*seh 18

由于caddr相当于third在Common Lisp的,我用Clojure看到的最接近的是nth:

(nth collection 2)
Run Code Online (Sandbox Code Playgroud)

它更通用caddr,因为它渴望在更多的细胞链结构上工作.但是请注意,这是它不是一个地方,因为它是Common Lisp中.

  • 我认为你的意思是`(第n个集合2)` - `first`,`second`等等.函数从1开始,但是`nth`从0开始. (2认同)

til*_*ave 8

通常当我需要将概念从一种语言映射到另一种语言时,我会查看http://hyperpolyglot.org/

Clojure包含在Lisp页面上:http://hyperpolyglot.org/lisp

由此看来,似乎与caddr没有直接的类比.


Chu*_*uck 5

我想最接近的(caddr foo)(first (nnext foo)).但Clojure并不完全具有大多数Lisps所具有的"一切都是列表"的宗教信仰,并缺少来自Common Lisp的重型列表遍历快捷方式,而不支持序列的共享接口.