Ответ 1
Из двух слов car и cdr автомобиль - это тот, который я слышал в первую очередь.
Большая часть моего опыта Lisp исходит от Elisp. Таким образом, я нахожу, что пишу Lisp только по случаю. К тому времени, когда я возвращаюсь к нему, я часто забываю разницу между car
и cdr
и мне нужно ссылаться на документы, чтобы перетащить мою память.
Какие умные мнемоники вы используете для запоминания разницы между функциями Lisp, которые имеют корни именования, основанные на компьютерные архитектуры эпохи 1954 года (автомобиль, cdr, cadr, caar, cddr и т.д.)?
Кроме того, почему нет хорошо названных псевдонимов first
и rest
, получивших больше тяги в качестве идиоматических альтернатив для car
и cdr
?
Обновление. Я знаю фактические определения car
и cdr
и как они должны быть произносятся. Мнемоника только пожалуйста.
Полное раскрытие. Этот вопрос не совсем для меня. Это поможет другим новичкам Lisp преодолеть некоторые из первых препятствий.
Из двух слов car и cdr автомобиль - это тот, который я слышал в первую очередь.
Это действительно хромает, но поскольку никто не предложил ничего...
автомобиль для меня - это то, что движет, так что сначала. cdr - это caboose; это происходит после.
Видите, я сказал вам, что это хромало.
У меня нет мнемоники для запоминания car/cdr, хотя они в алфавитном порядке (a
предшествует d
, таким образом car
есть first
).
Насколько они придерживались (над такими вещами, как first
и rest
)? Большая часть, вероятно, всего лишь импульс, но другая - это то, что вы уже писали. Вы можете легко написать для них составные функции:
(caadar ...) -> (car (car (cdr (car ...))))
Они означают "Содержание регистра адреса" и "Содержание регистра декремента", термины, взятые из архитектуры IBM 704. Не то, чтобы это вам очень помогло!
У меня нет мнемоники для автомобиля и cdr. Я имею в виду, их только двое, и если вы вообще используете Lisp, мне кажется, что вы просто знаете. (Черт, я даже не использую Lisp, и я помню.)
Помимо удобной композиции, автомобиль и cdr имеют следующие преимущества перед первым и покоем: (1) короче, (2) одинаковой длины друг друга, (3) они появились раньше.
"автомобиль" и "cdr", по крайней мере для меня, это вещи, которые вы только что узнали, например, звуки для слов "слева" и "справа".
"first" и "rest" являются мнемоническими, если объект, который был деконструирован, является списком. Если это фактические минусы (т.е. Пунктирная пара), они не помогают.
Они застряли, потому что не было ничего, почти пятьдесят лет назад, когда LISP был впервые разработан. Все статьи, все книги, весь код использовали CAR и CDR, и все привыкли к ним.
Мнемоники, которые я использую:
CAR - копирование альфа-позиции и возврата
CDR - Копировать дендрит (часть дерева - без корня) и Return
Я снова возвращаюсь к попытке Lisp, но, надеюсь, это подходит.
Я склонен думать о начале списка как альфа-или корневой позиции.
Если первая позиция является корнем, и я привык видеть двоичные деревья (которые могут быть представлены как список), тогда слово, связанное с деревьями, похоже, будет в порядке. Дендрит имеет правильное начало письма и, кажется, подходит. Он представляет собой последнее дерево без корня.
Еще одно взятие от Роберта Смита:
CAR - "Кронштейн переднего региона"
CDR - "Спинная область клеток"
"Мы можем получить вторую часть клетки. Давайте назовем эту часть дорзальной областью (почему бы и нет?) Значение дорсала имеет больше смысла в списках, поскольку дорзальная область списка [1,2,3 ] является частью" ближе к концу", [2,3], тогда как задняя часть будет 3).
из Lisp имеет слишком много круглых скобок... (... или так они говорят!) Роберт Смит, 7 ноября 2010 г.
Я знаю, что это не имеет никакого отношения к тому, что изначально было аббревиатурами, но даже Стив Рассел сказал:
"Из-за неудачного временного пропадания вдохновения мы не могли думать о каких-либо других именах для двух указателей в списке node, чем" адрес "и" декремент ", поэтому мы назвали функции CAR для" Содержание "Адрес регистра" и CDR для "Содержание сокращения регистра".
Спустя несколько месяцев и давая несколько классов в Lisp, мы поняли, что "первый" и "отдых" были лучшими именами, и мы (Джон МакКарти, я и часть остального Проекта ИИ) пытались получить люди используют их вместо этого.
Увы, было уже слишком поздно! Мы не могли заставить его застрять. Итак, у нас есть CAR и CDR.
Я редко вижу car
и cdr
, гораздо чаще вижу код first
и rest
в коде. Поэтому я не могу согласиться с тем, что те, кто назван, не набрали силы.
Если вы не заботитесь о том, чтобы быть идиоматичным, используйте сначала и отдохните. автомобиль и cdr имеют преимущество в том, что они могут быть скомпонованы в комбинации типа caddr cddr и т.д., если вы найдете это полезным.
В противном случае сначала автомобиль, а в алфавитном порядке первый из двух.
Вы могли бы избежать проблемы, используя сначала и остальное.
Книга "Нежное введение в Lisp" отлично справляется с объяснением действительно больших, таких как
CADDDAADDR
Начните с правой стороны влево (ADDDAADD), так что выше (где ->
есть "then" ): CDR->CDR->CAR->CAR->CDR->CDR->CDR->CAR
.
Причина, по которой CAR
и CDR
предпочтительнее firt
, а rest
(я думаю), потому что они могут быть связаны цепью, чтобы сформировать такие функции, как выше.