Что эквивалентно Lisp caddr в Clojure?
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])
Ответ 6
Нет прямого эквивалента caddr
в Clojure, потому что Clojure имеет дело с последовательностями вместо конкретных cons
ячеек. Стоит прочитать Clojure документацию по последовательностям.
Ответ 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