Кадр в Clojure - PullRequest
       48

Кадр в Clojure

11 голосов
/ 04 марта 2011

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

Ответы [ 8 ]

21 голосов
/ 04 марта 2011

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.))

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

18 голосов
/ 04 марта 2011

Поскольку caddr эквивалентно third в Common Lisp, наиболее близким, что я вижу в Clojure, является nth:

(nth collection 2)

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

8 голосов
/ 04 марта 2011

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

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

Отсюда это выглядитчто нет прямого аналога caddr.

5 голосов
/ 04 марта 2011

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

4 голосов
/ 08 марта 2012

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

В Clojure нет прямого эквивалента caddr, потому что Clojure имеет дело с последовательностями вместо конкретных cons ячеек. Стоит прочитать документацию Clojure о последовательностях .

2 голосов
/ 27 марта 2011

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

(defn caddr [list]
  (first (rest (rest list))))
1 голос
/ 30 сентября 2012

Небольшое изменение в ответе Сатиша, но с использованием макроса, который компилирует функции 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
...