Caddr в Clojure

Что эквивалентно Lisp caddr в Clojure?

Ответ 1

caddr в Lisps часто используется таким образом, который составляет деструктурирование. Clojure имеет повсеместную поддержку деструктуризации, поэтому caddr менее полезен.

  (let [[_ _ x] [1 2 3 4]]
    x) ;; -> 3

EDIT: В ответ на @4bu3li.

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

Нет способа указать последний элемент w/destructuring, но это не связано с исходным вопросом.

Ответ 2

Как caddr эквивалентно third в Common Lisp, ближайший я вижу в Clojure nth:

(nth collection 2)

Он более общий, чем caddr, тем, что он стремится работать над большим количеством структур, которые сохраняют цепочки клеток. Обратите внимание, что это не place, как это описано в Common Lisp.

Ответ 3

Обычно, когда мне нужно отображать концепцию с одного языка на другой, я проверяю http://hyperpolyglot.org/

Clojure включен на страницу Lisp: http://hyperpolyglot.org/lisp

Из этого, кажется, нет прямого аналога с caddr.

Ответ 4

Я полагаю, что ближайший эквивалент (caddr foo) равен (first (nnext foo)). Но Clojure точно не имеет религии "все является списком", которую большинство Lisps имеют и не хватает ярких ярлыков переходов между Common Lisp в пользу общего интерфейса для последовательностей.

Ответ 5

Не так сложно сочинять и создавать свои собственные функции 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]) 

Ответ 7

Вы можете сделать это таким образом:

(defn caddr [list]
  (first (rest (rest list))))

Ответ 8

Небольшое отклонение от ответа 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