Один из больших расколов в сообществе Лиспа заключается в том, должны ли мы иметь car
и cdr
или first
и rest
. Одним из преимуществ традиционных car
и cdr
является то, что мы можем комбинировать их для создания произносимых функций, таких как cdaddr
. Как Лиспы, которые не используют car
и cdr
, такие как Clojure, обычно образуют такие комбинации с first
и rest
? Есть ли консенсус?
Как lisp'ы, предпочитающие first и rest машине и cdr, приближаются к таким комбинациям, как cdaddr?
Ответы (1)
Clojure, во всяком случае, просто не нуждается в caddaadr и его друзьях, потому что никто не строит структуры данных только из cons-ячеек. В языке есть комбинации любых двух first
и next
, называемые ffirst
, fnext
, nnext
и nfirst
, которые были добавлены очень рано, я полагаю, потому что предполагалось, что нам понадобится что-то вроде cadr, но я никогда не видел, чтобы они использовались в реальная жизнь. Вместо этого довольно часто используется деструктуризация.
В тех редких случаях, когда вам нужно глубоко проникнуть в структуру, построенную из вложенных последовательностей, деструктуризация часто по-прежнему создает читаемый код, но его запись от руки не представляет большого труда. Это также хороший намек на то, что, возможно, вам следует немного больше абстрагироваться, а не работать напрямую с таким количеством слоев примитивных комбинаторов.
first
иrest
, они обращаются с conses как с вещами, из которых вы можете создавать структуры, которые не являются просто списками как чем-то второстепенным. Например, список — это список (first
/rest
) пар (car
/cdr
), а не список списков. (Это не делает всеcdaaaaddaddr
чем-то большим, чем исторический курьез.) - person   schedule 31.01.2021