Jump to content

АВТОМОБИЛЬ и CDR

В компьютерном программировании CAR ( car) / k ɑːr / и CDR ( cdr) ( / ˈ k ʌ d er / или / ˈ k ʊ d er / ) — примитивные операции над cons -ячейками (или «неатомарные S-выражения »), представленные в языке программирования Lisp . Cons-ячейка состоит из двух указателей ; операция car извлекает первый указатель, а операция cdr — второй.

Таким образом, выражение (car (cons x y)) оценивается как x, и (cdr (cons x y)) оценивается как y.

Когда cons-ячейки используются для реализации односвязных списков (а не деревьев и других более сложных структур ), операция car возвращает первый элемент списка, а cdr остальную часть списка. По этой причине операциям иногда присваиваются имена first and rest или head and Tail .

Этимология

[ редактировать ]

Первоначально Lisp был реализован на компьютере IBM 704 в конце 1950-х годов.

Популярное объяснение, что CAR и CDR означают «Содержимое регистра адреса» и «Содержимое декрементного регистра». [1] не совсем соответствует архитектуре IBM 704; IBM 704 не имеет адресного регистра, доступного программисту, а три регистра модификации адреса в IBM называются «индексными регистрами».

704 и его преемники имеют 36 бит длину слова 15 бит и адресное пространство . Эти компьютеры имели два формата инструкций , один из которых, тип A, имел короткий 3-битный префикс кода операции и два 15-битных поля , разделенные 3-битным тегом. Первое 15-битное поле представляло собой адрес операнда, а второе содержало декремент или счетчик. Тег указывает один из трех индексных регистров . Индексирование на 704 представляло собой вычитательный процесс, поэтому значение, загружаемое в индексный регистр, называлось «декрементом». [2] : с. 8 Аппаратное обеспечение 704 имело специальные инструкции для доступа к полям адреса и уменьшения одним словом. [2] : с. 26 В результате было эффективно использовать эти два поля для хранения в одном слове двух указателей, необходимых для списка. [3] : Введение.

Таким образом, «АВТОМОБИЛЬ» — это «Содержимое адресной части Реестра». Термин «регистр» в этом контексте относится к «ячейке памяти». [4] [5]

Прекурсоры [6] [7] в Лисп включены функции:

  • car («содержимое адресной части номера реестра»),
  • cdr («содержимое декрементной части номера регистра»),
  • cpr («содержимое префиксной части номера регистра») и
  • ctr («содержимое теговой части номера регистра»),

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

704 макроса

[ редактировать ]

704 ассемблера Макрос для car был: [8] [9] [10]

LXD JLOC 4  # C( Decrement of JLOC ) → C( C )  # Loads the Decrement of location JLOC into Index Register C
CLA 0,4     # C( 0 - C( C ) ) → C( AC )        # The AC register receives the start address of the list
PAX 0,4     # C( Address of AC ) → C( C )      # Loads the Address of AC into Index Register C
PXD 0,4     # C( C ) → C( Decrement of AC )    # Clears AC and loads Index Register C into the Decrement of AC

Макрос ассемблера 704 для cdr был: [8] [9] [10]

LXD JLOC 4  # C( Decrement of JLOC ) → C( C )  # Loads the Decrement of location JLOC into Index Register C
CLA 0,4     # C( 0 - C( C ) ) → C( AC )        # The AC register receives the start address of the list
PDX 0,4     # C( Decrement of AC ) → C( C )    # Loads the Decrement of AC into Index Register C
PXD 0,4     # C( C ) → C( Decrement of AC )    # Clears AC and loads Index Register C into the Decrement of AC

Машинное слово можно было собрать с помощью cons , который принимал четыре аргумента ( a , d , p , t ).

Части префикса и тега были исключены на ранних стадиях разработки Лиспа, оставив CAR, CDR и CONS с двумя аргументами. [3]

Композиции

[ редактировать ]

Композиции car и cdr можно давать короткие и более или менее произносимые имена одной и той же формы. В Лиспе (cadr '(1 2 3)) является эквивалентом (car (cdr '(1 2 3))); его значение 2. Сходным образом, (caar '((1 2) (3 4))) (произносится / ˈ k ɑːr / ) то же самое, что и (car (car '((1 2) (3 4)))); его значение 1. Большинство Lisp, например Common Lisp и Scheme , систематически определяют все варианты двух-четырех композиций. car и cdr.

Другие компьютерные языки

[ редактировать ]

Многие языки (особенно функциональные языки и языки, находящиеся под влиянием функциональной парадигмы ) используют односвязный список в качестве базовой структуры данных и предоставляют примитивы или функции, аналогичные car и cdr. Их называют по-разному first и rest, head и tailи т. д. Однако в Лиспе ячейка cons используется не только для построения связанных списков, но и для построения парных и вложенных парных структур, т.е. cdr минус-ячейки не обязательно должны быть списком. В этом случае большинство других языков предоставляют разные примитивы, поскольку они обычно отличают парные структуры от списочных структур либо по типу, либо по семантике. В частности, в типизированных языках списки, пары и деревья будут иметь разные функции доступа с разными сигнатурами типов: в Haskell например, car и cdr становиться fst и snd при работе с парным типом. Точные аналоги car и cdr поэтому редки в других языках. Clojure Использование first вместо car и next или rest вместо cdr. Логотип , с другой стороны, использует first вместо car и butfirst вместо cdr.

  1. ^ См., например, Митчелл, Джон К. (2003), Концепции языков программирования , Cambridge University Press, стр. 28–29, ISBN  9781139433488 , Раздел 3.4, Инновации в разработке Lisp . Ссылка идентифицирует IBM 704 и правильно объясняет адрес и декрементную часть минус-ячейки, но затем опускает «часть» в объяснении Маккарти.
  2. ^ Перейти обратно: а б 704 - электронная вычислительная машина http://bitsavers.informatik.uni-stuttgart.de/pdf/ibm/704/24-6661-2_704_Manual_1955.pdf
  3. ^ Перейти обратно: а б Маккарти, Джон (12 февраля 1979 г.). «История Лиспа» .
  4. ^ Маккарти (1960 , стр. 26–27) обсуждает регистры в списке свободных и при сборке мусора.
  5. ^ Маккарти, Джон; Абрахамс, Пол В.; Эдвардс, Дэниел Дж.; Харт, Тимоти П.; Левин, Майкл И. (1985), Руководство программиста LISP 1.5 (второе изд.), Кембридж, Массачусетс: MIT Press, ISBN  978-0-262-13011-0 , стр. 36, описывает cons-ячейки как слова с 15-битными полями «адрес» и «уменьшение».
  6. ^ Язык обработки списков, скомпилированный на Фортране
  7. ^ Язык обработки списков, скомпилированный на Фортране; HTML-транскрипция
  8. ^ Перейти обратно: а б Отрывки из LISP-СТРАНИЦ NILS - http://t3x.dyndns.org/LISP/QA/carcdr.html.
  9. ^ Перейти обратно: а б Памятка 6 лаборатории MIT AI Lab https://web.archive.org/web/20170706114352/ftp://publications.ai.mit.edu/ai-publications/pdf/AIM-006.pdf
  10. ^ Перейти обратно: а б КОДИРОВАНИЕ ДЛЯ КОМПЬЮТЕРА MIT-IBM 704 http://bitsavers.informatik.uni-stuttgart.de/pdf/mit/computer_center/Coding_for_the_MIT-IBM_704_Computer_Oct57.pdf
Примечания
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 55df049295cc1059e6325af9bbe4e6de__1721345280
URL1:https://arc.ask3.ru/arc/aa/55/de/55df049295cc1059e6325af9bbe4e6de.html
Заголовок, (Title) документа по адресу, URL1:
CAR and CDR - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)