CAR и CDR - CAR and CDR
В компьютерное программирование, МАШИНА (машина
) /kɑːr/ (Слушать) и CDR (CDR
) (/ˈkʌdər/ (Слушать) или /ˈkʊdər/ (Слушать)) - примитивные операции над минусы клетки (или "неатомные S-выражения ") введены в Язык программирования Лисп. Консольная ячейка состоит из двух указатели; то машина операция извлекает первый указатель, а CDR операция извлекает второй.
Таким образом, выражение (машина (минусы Икс у))
оценивает Икс
, и (cdr (минусы Икс у))
оценивает у
.
Когда cons-ячейки используются для реализации односвязные списки (скорее, чем деревья и другие более сложные структуры ), машина операция возвращает первый элемент списка, а CDR возвращает остальные списка. По этой причине операциям иногда дают названия первый и остальные или голова и хвост.
Этимология
Изначально Лисп был реализован на IBM 704 компьютер, в конце 1950-х.
Популярное объяснение, что МАШИНА и CDR обозначают «Содержимое адресного регистра» и «Содержимое декрементного регистра»[1] не совсем соответствует архитектуре IBM 704; IBM 704 не имеет доступного программисту адресного регистра, и три регистра изменения адреса называются IBM "индексными регистрами".
704 и его преемники имеют 36-битный слово длина и 15-битный адресное пространство. На этих компьютерах было два инструкция форматы, один из которых, Тип A, имел короткий, 3-битный, код операции префикс и два 15-битных поля разделены 3-битным тегом. Первое 15-битовое поле было адресом операнда, а второе содержало декремент или счетчик. В теге указан один из трех индексные регистры. Индексирование на 704 было вычитающим процессом, поэтому значение, загружаемое в индексный регистр, называлось «декрементом».[2]:п. 8 Аппаратное обеспечение 704 имело специальные инструкции для доступа к полям адреса и декремента одним словом.[2]:п. 26 В результате было эффективно использовать эти два поля для хранения в одном слове двух указателей, необходимых для списка.[3]:Вступление.
Таким образом, «CAR» - это «Содержание адреса. часть Регистра ». Термин« регистр »в этом контексте относится к« ячейке памяти ».[4][5]
Прекурсоры[6][7] в Лисп включены функции:
машина
(«содержимое адресной части номера регистра»),CDR
(«содержимое декрементной части номера регистра»),cpr
(«содержимое префиксной части номера регистра»), иctr
("содержимое теговой части номера регистра"),
каждый из которых принимает в качестве аргумента машинный адрес, загружает соответствующее слово из памяти и извлекает соответствующие биты.
704 макроса
Макрос ассемблера 704 для машина
был:[8][9][10]
LXD JLOC 4 # C (уменьшение JLOC) → C (C) # Загружает уменьшение местоположения JLOC в индексный регистр CCLA 0,4 # C (0 - C (C)) → C (AC) # Регистр AC получает начальный адрес спискаPAX 0,4 # C (Адрес AC) → C (C) # Загружает адрес AC в индексный регистр CPXD 0,4 # C (C) → C (Уменьшение AC) # Очищает AC и загружает индексный регистр C в Decrement AC
Макрос ассемблера 704 для CDR
был:[8][9][10]
LXD JLOC 4 # C (уменьшение JLOC) → C (C) # Загружает уменьшение местоположения JLOC в индексный регистр CCLA 0,4 # C (0 - C (C)) → C (AC) # Регистр AC получает начальный адрес спискаPDX 0,4 # C (уменьшение AC) → C (C) # Загружает уменьшение AC в индексный регистр CPXD 0,4 # C (C) → C (Уменьшение AC) # Очищает AC и загружает индексный регистр C в Decrement AC
Машинное слово можно собрать заново минусы, который принял четыре аргумента (а,d,п,т).
Части префикса и тега были отброшены на ранних этапах разработки Lisp, оставив CAR, CDR и CONS с двумя аргументами.[3]
Композиции
Композиции из машина
и CDR
можно давать короткие и более или менее произносимые имена одинаковой формы. В Лиспе (кадр '(1 2 3))
эквивалентно (автомобиль (cdr '(1 2 3)))
; его ценность 2
. Так же, (каар '((1 2) (3 4)))
такой же как (автомобиль (автомобиль '((1 2) (3 4))))
; его ценность 1
. Например, большинство Лиспов Common Lisp и Схема, систематически определять все вариации двух-четырех композиций машина
и CDR
.
Другие компьютерные языки
Многие языки (особенно функциональный языки и языки, на которые влияет функционал парадигма ) использовать односвязный список в качестве базовой структуры данных и предоставляют примитивы или функции, аналогичные машина
и CDR
. Они называются по-разному первый
и остальные
, голова
и хвост
и т. д. В Лиспе, однако, cons-ячейка используется не только для построения связанных списков, но также для построения парных и вложенных парных структур, т.е. CDR
cons-ячейки не обязательно должен быть списком. В этом случае большинство других языков предоставляют различные примитивы, поскольку они обычно различают парные структуры от структур списков либо типично, либо семантически. В частности, в типизированных языках списки, пары и деревья будут иметь разные функции доступа с разными типами сигнатур: в Haskell, Например, машина
и CDR
становиться первый
и snd
при работе с парным типом. Точные аналоги машина
и CDR
поэтому редко встречаются в других языках.
Рекомендации
- ^ См., Например, Митчелл, Джон С. (2003), Концепции языков программирования, Cambridge University Press, стр. 28–29, ISBN 9781139433488, Раздел 3.4, Инновации в дизайне Lisp. Ссылка идентифицирует IBM 704 и правильно объясняет адрес и декремент части cons-ячейки, но затем опускает «часть» в объяснении Маккарти.
- ^ а б 704 - машина электронной обработки данных http://bitsavers.informatik.uni-stuttgart.de/pdf/ibm/704/24-6661-2_704_Manual_1955.pdf
- ^ а б Маккарти, Джон (1979-02-12). "История Лиспа".
- ^ Маккарти (1960, стр. 26–27). обсуждает регистры в свободном списке и в сборке мусора.
- ^ Маккарти, Джон; Abrahams, Paul W .; Эдвардс, Дэниел Дж .; Харт, Тимоти П .; Левин, Михаил Иванович (1985), Руководство программиста LISP 1.5 (второе изд.), Кембридж, Массачусетс: MIT Press, ISBN 978-0-262-13011-0, стр. 36, cons-ячейки описаны как слова с 15-битными полями «адрес» и «декремент».
- ^ Скомпилированный на Фортране язык обработки списков
- ^ Язык обработки списков, скомпилированный на Фортране; Транскрипция HTML
- ^ а б Отрывки из LISP PAGES NILS- http://t3x.dyndns.org/LISP/QA/carcdr.html
- ^ а б Записка 6 лаборатории искусственного интеллекта Массачусетского технологического института ftp://publications.ai.mit.edu/ai-publications/pdf/AIM-006.pdf
- ^ а б КОДИРОВКА ДЛЯ КОМПЬЮТЕРА MIT-IBM 704 ftp://bitsavers.informatik.uni-stuttgart.de/pdf/mit/computer_center/Coding_for_the_MIT-IBM_704_Computer_Oct57.pdf
- Примечания
- Рассел, Стив. «Написание и отладка программ» (PDF). RLE и MIT Computing Center. Публикации и цифровой архив CSAIL (Памятка). Памятка AI, нет. 6. Кембридж , Массачусетс: Лаборатория искусственного интеллекта Массачусетского технологического института. OCLC 35415961. Получено 20 июля, 2017.
- Фазе, Франс (10 января 2006 г.). «Происхождение CAR и CDR в LISP».
- Грэм, Пол (1996). ANSI Common Lisp. Прентис Холл. ISBN 978-0-13-370875-2.
- Барски, Конрад (2010). Land of Lisp: учитесь программировать на Лиспе, по одной игре за раз!. Сан-Франциско, Калифорния: No Starch Press, Inc. ISBN 978-1-59327-281-4.