Clojure的caddr

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所拥有的那种“一

在Clojure中Lisp的caddr的等价物是什么?

在Clojure中没有直接等价物
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