Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,755

CAR и CDR

16.04.2020, 16:31. Показов 1758. Ответов 38
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Сначала решил потренироваться с CAR, вот что изобразил:
Lisp
1
2
3
4
5
6
7
8
9
10
[5]> (car '((a s d (f x ( g y (((z))) u) (t tr tt)(yq (rq (rn (((gd))))))))))
 
(A S D (F X (G Y (((Z))) U) (T TR TT) (YQ (RQ (RN (((GD))))))))
[6]> (car(car '('(a s d (f x ( g y (((z))) u) (t tr tt)(yq (rq (rn (((gd)))))))))))
 
QUOTE
[7]> (car(car '('(a s d '(f x '( g y '(((z))) u) (t tr tt)(yq (rq (rn (((gd)))))))))))
 
QUOTE
[8]>
Задание на скриншоте.
Вложения, ожидающие проверки
Тип файла: jpg Car.jpg
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.04.2020, 16:31
Ответы с готовыми решениями:

car и cdr
Выделите с помощью комбинации вызовов “car” и “cdr” элементы x, y, z из следующих списков, а также все элементы, символы которых состоят из...

Car и Cdr
Выделите с помощью комбинации вызовов “car” и “cdr” элементы x, y, z из следующих списков, а также все элементы, символы которых состоят...

Композиция CAR и CDR
Помогите составить композицию из функций CAR и CDR, для которой результатом применения этой композиции к списку (1 2 (3 (4) 5)) будет 4 ...

38
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38214 / 21147 / 4313
Регистрация: 12.02.2012
Сообщений: 34,760
Записей в блоге: 14
17.04.2020, 11:24
Студворк — интернет-сервис помощи студентам
Рыжий Лис, в дополнение к сказанному есть еще доступ к списку по номеру (естественно, за время O(n)):

Lisp
1
(nth n list) ;; n-й элемент списка, счет с нуля
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
17.04.2020, 11:25
Вот first и rest - уже лучше.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38214 / 21147 / 4313
Регистрация: 12.02.2012
Сообщений: 34,760
Записей в блоге: 14
17.04.2020, 11:26
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Есть какая-то мнемоника для этих команд? А то запомнить не получается.
- дело привычки.
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
17.04.2020, 11:27
Из ссылки на вики
car ("contents of the address part of register number"),
cdr ("contents of the decrement part of register number"),
cpr ("contents of the prefix part of register number"), and
ctr ("contents of the tag part of register number"),
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38214 / 21147 / 4313
Регистрация: 12.02.2012
Сообщений: 34,760
Записей в блоге: 14
17.04.2020, 11:32
Вот еще две небесполезные функции:

Lisp
1
2
3
4
5
(butlast '(1 2 3)) ;; список без последнего элемента
==> (1 2)
 
(last '(1 2 3)) ;; список, включающий только последний элемент
==> (3)
Добавлено через 4 минуты
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Из ссылки на вики
две последних не используются. А первые две - да, их происхождение идет от ассемблера IBM-709. Это давняя традиция лисперов.

Есть еще куча функций вида:

Lisp
1
2
3
(cddr x) = (cdr (cdr x))
(cadr x) = (car (cdr x)) ;; то же, что (nth 1 x) - т.е. второй элемент
...
Между "c" и "r" допустима любая комбинация "a" и "d", длиной не более 4 (кажется). Знатоки стандартов поправят.
0
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,755
17.04.2020, 11:37  [ТС]
Ещё вот это нужно запомнить
Миниатюры
CAR и CDR  
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38214 / 21147 / 4313
Регистрация: 12.02.2012
Сообщений: 34,760
Записей в блоге: 14
17.04.2020, 11:39
А вот то, о чем писал helter - функция, которая по списку и атому строит выражение из car и cdr, которое позволяет этот атом извлечь:



Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
(defun scan-list (list a)
  (cond ((null list) nil)
        ((atom (car list))  
          (cond ((eq a (car list)) (list 'car t))
                (t (cons 'cdr (scan-list (cdr list) a)))))
        (t (let ((left  (cons 'car (scan-list (car list) a)))
                 (right (cons 'cdr (scan-list (cdr list) a))))
               (if (member t left) left right)))))
 
(defun make-expr (tree a)
  (let ((scan (scan-list tree a)))
    (if (member t scan)
        (reduce (lambda (acc x) (list x acc)) (butlast scan) 
                :initial-value (list 'quote tree))
        nil)))
 
(make-expr '((1 2 3) (4 5 6)) 5)
==> (CAR (CDR (CAR (CDR (QUOTE ((1 2 3) (4 5 6)))))))
 
(CAR (CDR (CAR (CDR (QUOTE ((1 2 3) (4 5 6)))))))
==> 5
 
(make-expr '((a s d (f x ( g y (((z))) u) (t tr tt)(yq (rq (rn (((gd))))))))) 'tt)
 
==> (CAR (CDR (CDR (CAR (CDR (CDR (CDR (CAR (CDR (CDR (CDR (CAR (QUOTE ((A S D (F X (G Y (((Z))) U) (T TR TT) (YQ (RQ (RN (((GD))))))))))))))))))))))
 
(CAR (CDR (CDR (CAR (CDR (CDR (CDR (CAR (CDR (CDR (CDR (CAR (QUOTE ((A S D (F X (G Y (((Z))) U) (T TR TT) (YQ (RQ (RN (((GD))))))))))))))))))))))
==> TT
1
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
17.04.2020, 12:15
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
А car и cdr - фиг поймёшь где что.
В вике написано что.
1
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
17.04.2020, 12:23
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Из ссылки на вики
Да! От них веет такой ламповостью, что все их обожают, и в новых диалектах они продолжают использоваться. А cons, тоже странный, вообще перерос лисп и ушёл в народ.

В CL определены функции first, second, ..., tenth для доступа к первым элементам и rest для хвоста. Гугловское руководство по стилю https://google.github.io/style... _vs._Pairs предлагает использовать выбирать синоним по контексту. В CL нет списков, есть только конс-ячейки. Список - это цепочка конс-ячеек определённого вида (когда cdr-ами цепляются и без петель, а в конце желательно nil). Если данная цепочка рассматривается как список, к ней применяются функции first, rest, endp. Однако конс-ячейки важны и сами по себе, а не только как строительные блоки для списков (например, на их основе можно реализовать циклический список или очередь). При работе с конс-ячейками как таковыми предлагается использовать car, cdr и null. По-моему, имеет смысл.
1
Заблокирован
17.04.2020, 13:46
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Есть какая-то мнемоника для этих команд? А то запомнить не получается.
главное - это запомнить что car возвращает первый элемент списка, а cdr - все, элементы, кроме первого.
дальше логика совмещения : cadr - это car+cdr. Короче будет написать cadr, чем (car (cdr ...))
0
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,755
17.04.2020, 15:37  [ТС]
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
Это решение только первой строки задания №2:
((a s d (f x ( g y (((z))) u) (t tr tt)(yq (rq (rn (((gd)))))))))
Вставлять пробелы не стал, некогда этим сейчас заниматься. Делал в LispIDE.
 
(car(cdr(car(cdr(cdr(cdr (car '((a s d (f x ( g y (((z))) u) (t tr tt)(yq (rq (rn (((gd))))))))))))))))
X
 
(car(cdr(car(cdr(cdr(car(cdr(cdr(cdr (car '((a s d (f x ( g y (((z))) u) (t tr tt)(yq (rq (rn (((gd))))))))))))))))
 
[26]> (car(cdr(car(cdr(cdr(car(cdr(cdr(cdr (car '((a s d (f x ( g y (((z))) u) (t tr tt)(yq (rq (rn (((gd)))))))))))))))))))
Y
[27]> 
 
[28]> (car(car(car(car(cdr(cdr(car(cdr(cdr(car(cdr(cdr(cdr (car '((a s d (f x ( g y (((z))) u) (t tr tt)(yq (rq (rn (((gd)))))))))))))))))))))))
Z
 
 
[52]> (car(cdr(car(cdr(cdr(cdr(car(cdr(cdr(cdr (car '((a s d (f x ( g y (((z))) u) (t tr tt)(yq (rq (rn (((gd))))))))))))))))))))
TR
[53]>
 
[53]> (car(cdr(cdr(car(cdr(cdr(cdr(car(cdr(cdr(cdr (car '((a s d (f x ( g y (((z))) u) (t tr tt)(yq (rq (rn (((gd)))))))))))))))))))))
TT
[54]> 
 
[7]> (car(car(cdr(cdr(cdr(cdr(car(cdr(cdr(cdr (car '((a s d (f x ( g y (((z))) u) (t tr tt)(yq (rq (rn (((gd))))))))))))))))))))
YQ
[8]> 
 
[13]> (car(car(cdr(car(cdr(cdr(cdr(cdr(car(cdr(cdr(cdr (car '((a s d (f x ( g y (((z))) u) (t tr tt)(yq (rq (rn (((gd))))))))))))))))))))))
RQ
[14]> 
 
[15]> (car(car(cdr(car(cdr(car(cdr(cdr(cdr(cdr(car(cdr(cdr(cdr (car '((a s d (f x ( g y (((z))) u) (t tr tt)(yq (rq (rn (((gd))))))))))))))))))))))))
RN
[16]> 
 
[17]> (car(car(car(car(cdr(car(cdr(car(cdr(car(cdr(cdr(cdr(cdr(car(cdr(cdr(cdr (car '((a s d (f x ( g y (((z))) u) (t tr tt)(yq (rq (rn (((gd))))))))))))))))))))))))))))
GD
[18]>
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38214 / 21147 / 4313
Регистрация: 12.02.2012
Сообщений: 34,760
Записей в блоге: 14
17.04.2020, 16:07
Несомненный успех!
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
18.04.2020, 15:06
Несите теперь знания в народ Получить из исходного списка необходимый символ или список
1
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,755
18.04.2020, 15:59  [ТС]
Не знаю, как решать задачу по ссылке. Знаю, что существуют ещё NTH и LAST.
0
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,755
19.04.2020, 13:59  [ТС]
Имена функций CAR и CDR возникли по историческим причинам. Автор Лиспа реализовывал свою первую систему на машине IBM 605. Для хранения адреса головы списка
использовался регистр CAR (content of address registr) Для хранения адреса хвоста списка использовался регистр CDR (contеnt of decrement registr)
Источник http://www.mari-el.ru/mmlab/ho... index.html

Добавлено через 6 минут
Что то не запускается пример с этой страницы
Lisp
1
(FIRST (REST '( 1 2 3 4 ))
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38214 / 21147 / 4313
Регистрация: 12.02.2012
Сообщений: 34,760
Записей в блоге: 14
19.04.2020, 14:10
Читаем внимательно: "В MCL можно наряду с CAR и CDR использовать имена FIRST REST" - а мы в MCL? Может, нет таких функций? Тогда определи их сам:

Lisp
1
2
(defun first (x) (car x))
(defun rest (x) (cdr x))
И все заработает
1
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
25.04.2020, 10:13
Цитата Сообщение от Catstail Посмотреть сообщение
Тогда определи их сам:
Компилятор умеет делать inline функций? Если нет, может, лучше написать макрос?
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38214 / 21147 / 4313
Регистрация: 12.02.2012
Сообщений: 34,760
Записей в блоге: 14
25.04.2020, 11:33
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
лучше написать макрос?
- макрос чтения, пожалуй да. А обычный макрос - выйдет так на так.
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
25.04.2020, 13:39
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Компилятор умеет делать inline функций?
Да. Компилятор может делать это по своему усмотрению, также есть декларации inline и notinline. Но при разработке они не очень удобны: если переопределить заинлайненную функцию, приходится переопределять и все функции, в которые она была заинлайнена. В конце можно добавить, когда всё отлажено.

Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Если нет, может, лучше написать макрос?
Вообще говоря, есть традиционная точка зрения «не писать макрос, если достаточно функции». Не говоря о том, что при изменении макроса тоже приходится перекомпилировать весь код, в котором он используется, макрос нельзя мапнуть или передать в качестве аргумента в функцию.

Есть ещё такая штука - макросы компилятора (compiler macros). Они позволяют изменять поведение при компиляции форм вызовов функции или макроса. Например:
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
(defun double (x)
  (* x 2))
 
(defun foo ()
  (double 3))
  
; disassembly for FOO
; Size: 30 bytes. Origin: #x52D2420C                          ; FOO
; 0C:       498B4510         MOV RAX, [R13+16]                ; thread.binding-stack-pointer
; 10:       488945F8         MOV [RBP-8], RAX
; 14:       BA06000000       MOV EDX, 6
; 19:       B902000000       MOV ECX, 2
; 1E:       FF7508           PUSH QWORD PTR [RBP+8]
; 21:       B842A84F50       MOV EAX, #x504FA842              ; #<FDEFN DOUBLE>
; 26:       FFE0             JMP RAX
; 28:       CC10             INT3 16                          ; Invalid argument count trap
Видим, что double вызывается. В частности, если эту функцию переопределить, foo автоматически переопределится. (Это важный эффект, потому что разработка всегда происходит «на живую»). А теперь напишем такой макрос компилятора, который вызовы вида (double число) будет заменять на удвоенное число.
Lisp
1
2
3
4
(define-compiler-macro double (&whole form arg)
  (if (numberp arg)
      (* arg 2)
      form))
Короче говоря, это значит, что если аргументом в форме является число, то вместо вызова функции в код вставляется удвоенное число, в противном случае - вставляется сам вывод функции. Перекомпилировав foo, получаем:
Lisp
1
2
3
4
5
6
7
8
9
10
; disassembly for FOO
; Size: 21 bytes. Origin: #x52D1C92C                          ; FOO
; 2C:       498B4510         MOV RAX, [R13+16]                ; thread.binding-stack-pointer
; 30:       488945F8         MOV [RBP-8], RAX
; 34:       BA0C000000       MOV EDX, 12
; 39:       488BE5           MOV RSP, RBP
; 3C:       F8               CLC
; 3D:       5D               POP RBP
; 3E:       C3               RET
; 3F:       CC10             INT3 16                          ; Invalid argument count trap
Вызова double уже нет.

Но, честно говоря, пока ещё не приходилось ими пользоваться. Даже не добавил define-compiler-macro в вимовский список lispwords - как если бы у книги были неразрезанные страницы.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.04.2020, 13:39

Функции CAR и CDR
Здравствуйте, необходимо решить задачку описанную ниже, сам я в этом деле почти 0. &quot;На языке Лисп составьте композицию из функций...

функции CAR и CDR
На языке Лисп составьте композицию из функций CAR и CDR, для которой результатом применения этой композиции к списку (1 2 (3 4 (5))) будет...

Функции CAR и CDR
Прошу помочь в решение задачи Запишите последовательности вызовов CAR и CDR, выделяющие из приведенных ниже списков символ...

Составить композицию из функций CAR и CDR
На языке Лисп составьте композицию из функций CAR и CDR, для которой результатом применения этой композиции к списку (1 (2) ((3 4) 5))...

CAR и CDR для разбора списков
Из этой же оперы: 1. Используя базовые функции, выясните, равен ли цвет волос ANN, заданный в списке ((DOLLY HAIR BLOND) (ANN HEIGHT 68)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
39
Ответ Создать тему
Новые блоги и статьи
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru