Что означает «моя другая машина - компакт-диск»?

89

Может ли кто-нибудь, хорошо разбирающийся в шепелявлении, объяснить мне эту шутку? Я читал о языках функционального программирования и знаю, что CAR / CDR означает содержимое регистра адреса / декремента, но я до сих пор не совсем понимаю юмор.

КапитанКейси
источник
10
начни немного «плести интриги», и тогда ты поймешь. хахаха. это лучше, чем наклейка на бампер с надписью «этот программист останавливает все сборщики мусора».
gonzobrains
8
Примерно через полчаса после того, как на этот вопрос была ссылка на news.ycombinator.com/item?id=14416846, он был приостановлен. Это вопрос восьмилетней давности. Раздражает то, что я не могу возражать против статуса ожидания, но мне не нравится атмосфера, когда он откладывается сейчас .
i336_
@ i336_ согласно мета-дискуссии , он закрыт, чтобы новые ответы не засоряли очередь на просмотр.
Эндрю
2
Нет ли других причин задержки? Основанное на мнении ... неверно
Entendu
6
Разве его не следует защищать?
Федерико Клез Каллока

Ответы:

134

В Лиспе элемент связанного списка называется CONS. Это структура данных с двумя элементами, которые по историческим причинам называются CAR и CDR. (Некоторые программисты на Common Lisp предпочитают обращаться к ним с помощью функций FIRST и REST, в то время как другим нравится CAR и CDR, потому что они хорошо подходят для предварительно составленных версий, таких как (CADR x) ≡ (CAR (CDR x)).

Шутка - это пародия на наклейки на бампере, которые иногда можно увидеть на потрепанных старых машинах, с надписью «Другая моя машина - Porsche / BMW и т. Д.».

Мой ответ на эту шутку всегда был «Мой другой CAR является CADR. CDR не CAR на всех.»

Питер С. Хаузел
источник
1
очень красиво, но неправда. Не после (rplacd a (car a))этого явно не будет. :) Обычный LISP - это не Haskell. Но спасибо за объяснение. +1.
Уилл Несс
2
Я не хотел объяснять свою шутку, но ... дело в том, что операция CDR - это не операция CAR ; это отдельная проблема от того, эквивалентны ли значения через RPLACD или что-то еще.
Питер С. Хаузел
1
Кроме того, CDR звучит как название спортивного автомобиля, перекликающееся с TVR или GT-R, поэтому можно было прочитать текст и даже не понять его более глубокого, LISP-значения.
grkvlt
4
На случай, если кто-то захочет узнать, CAR означает содержимое адресной части номера регистра , а CDR означает содержимое части декремента номера регистра . Спасибо, Википедия !
Коджиро
1
Как насчет «других моих carIS first». :)
Kaz
34

Да, определенно шутка компьютерных фанатов.

Названия взяты от IBM 704, но это не шутка.

Шутка - это (плохой) каламбур на тему «другая моя машина ___». Но шутка о рекурсии.

Когда вы зацикливаете / манипулируете / выбираете / вызываете / больше в lisp, вы используете комбинацию car (первый элемент в списке) и cdr (остальная часть списка) для манипулирования функциями.

Итак, у вас есть машина, но другая ваша машина - это ваш cdr, потому что вы всегда можете получить машину с cdr, поскольку cdr всегда (в рекурсии) содержит больше элементов. Возьми? Смеетесь еще?

Вам, вероятно, придется научиться шепелявить, чтобы немного посмеяться, или нет. Конечно, к тому времени вы, вероятно, обнаружите, что беспорядочно хихикаете без видимой причины, потому что:

Lisp делает вас зацикленным.

дзен
источник
2
И с вашего последнего вздоха началась другая игра.
zxq9
14

// Исходя из схемы
схемы имеет очень мало структур данных, один из них является кортежем: '(first . second). В этом случае car- это первый элемент, а cdr- второй. Эта конструкция может быть расширена для создания списков, деревьев и других структур.
Шутка не очень смешная.

Коби
источник
1
Разве кортеж не будет '(первый, второй)?
Кен
1
@Ken - опять же, я не знаю лиспа, но у схемы нет такого сложного синтаксиса. Даже списки состоят из пар.
Коби
3
Действительно, правильнее было бы сказать, что кортеж есть (first . second). Список '(first second)состоит из двух кортежей, например:(cons first (cons second null))
mqp
1
Коби: Я знаю Лисп, и я не уверен, что вы имеете в виду под «сложным синтаксисом». Пунктирный синтаксис - это то, как вы пишете пары в Лиспе, включая схему: gnu.org/software/mit-scheme/documentation/mit-scheme-ref/… . Cdr (первая секунда) - (вторая), а не вторая.
Кен
3
Итак, теперь нас отвергают за исправление? Ну что ж. Будет светить солнце.
Коби