Clojure的caddr
在Clojure中Lisp的caddr的等价物是什么?在Clojure中没有直接等价物Clojure的caddr,clojure,lisp,jvm,Clojure,Lisp,Jvm,在Clojure中Lisp的caddr的等价物是什么?在Clojure中没有直接等价物caddr,因为Clojure处理的是序列而不是具体的cons单元。值得一读的是。因为caddr相当于Common Lisp,我在Clojure中看到的最接近的是: 它比caddr更通用,因为它渴望在更多的结构上工作,从而限制细胞链。但是请注意,这并不是一个常见的Lisp语言。我认为最接近的(caddr foo)等价物是(first(nnext foo))。但是Clojure并没有大多数Lisp所拥有的那种“一
caddr
,因为Clojure处理的是序列而不是具体的cons
单元。值得一读的是。因为caddr
相当于Common Lisp,我在Clojure中看到的最接近的是:
它比caddr更通用,因为它渴望在更多的结构上工作,从而限制细胞链。但是请注意,这并不是一个常见的Lisp语言。我认为最接近的
(caddr foo)
等价物是(first(nnext foo))
。但是Clojure并没有大多数Lisp所拥有的那种“一切都是一个列表”的宗教信仰,也没有Common Lisp中的大量列表遍历快捷方式来支持序列的共享接口。通常当我需要将一个概念从一种语言映射到另一种语言时,我会选择
Clojure包含在Lisp页面中:
从这一点来看,似乎没有caddr的直接类似物。Lisps中的caddr通常以相当于解构的方式使用。Clojure普遍支持解构,因此caddr不太有用
(let [[_ _ x] [1 2 3 4]]
x) ;; -> 3
编辑:回应@4bu3li
(defn describe-path [[first :as edge]]
`(there is a ~(last edge) going ~first from here.))
没有办法指定最后一个元素,但这与原始问题并不相关。您可以这样做:
(defn caddr [list]
(first (rest (rest list))))
编写和制作自己的ca+d+r函数并不难
(defn make-cadr
[fn-name]
(let [cadr {\a first \d rest}]
(apply comp (map cadr (butlast (drop 1 fn-name))))))
((make-cadr "caddr") [1 2 3 4 5])
Sathish的答案稍有变化,但使用编译
cadr
函数的宏:
(defmacro cadr-compiler [name]
(let [cadr {\a first \d rest}]
`(defn ~name [l#]
((apply comp (map ~cadr (butlast (drop 1 ~(str name))))) l#))))
(cadr-compiler caddr)
(caddr [1 2 3 4 5]) ;=> 3
我想你的意思是
(第n个集合2)
-第一个,第二个,等等。函数从1开始,但是第n个从0开始。@Hamish Grubijian:好的,任何seq都至少包含绑定列表中相同数量的元素。如果序列改为[12]
,则x
将为零,因为没有第三项。@dnolan会破坏此函数的工作吗?(defn descripe path[edge]`(这里有一条(最后一条边)到(第一条边))+1用于编译函数名,这是我第一次看到这种技术:-)
(defmacro cadr-compiler [name]
(let [cadr {\a first \d rest}]
`(defn ~name [l#]
((apply comp (map ~cadr (butlast (drop 1 ~(str name))))) l#))))
(cadr-compiler caddr)
(caddr [1 2 3 4 5]) ;=> 3