Точечные списки в AutoLisp
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Точечные списки в AutoLisp

Точечные списки в AutoLisp

Ответ
Поиск в этой теме
Непрочитано 23.03.2012, 15:10 #1
Точечные списки в AutoLisp
M_konst
 
Регистрация: 13.03.2009
Сообщений: 26

Доброе время суток!. Уважаемы спецы Автолиспа подскажите пож. хочу создать список типа:
Код:
[Выделить все]
 ((1 . 0) (2 . 0) (3 . 0))
Вот код которым пытаюсь осуществить это:
Код:
[Выделить все]
 
 (setq j 2)
 (setq mm '(1 . 0) kk 2)
  (repeat j
    (setq mm1 (cons (eval kk) 0))
    (setq mm (list mm mm1))
    (setq kk (1+ kk))
  )  
Прошу сильно не пинать. Просто лисп изучаю тока 3-й день.
Просмотров: 12095
 
Непрочитано 23.03.2012, 16:43
#2
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


(list (cons 1 0) (cons 2 0) (cons 3 0))
(mapcar 'cons (list 1 2 3 4) (list 0 0 0)))
(mapcar '(lambda (x) (cons x 0)) (list 1 2 3))
gomer вне форума  
 
Непрочитано 23.03.2012, 17:15
#3
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Ну и чтоб совсем запутать
Код:
[Выделить все]
 (defun test (x) (if (/= x 0) (cons (cons x 0) (test (1- x)))))
пример запуска (reverse (test 10))
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 23.03.2012, 23:14
#4
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


(reverse (test -10))
gomer вне форума  
 
Непрочитано 24.03.2012, 00:39
#5
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от gomer Посмотреть сообщение
(reverse (test -10))
А так же (test nil) (test "10") (test '10) - это функция для ПРОГРАММИСТА которая предполагает "правильные" аргументы, их соответствие надо проверять при получении (вводе пользователя, чтении и.т.д), иначе программа из одних проверок состоять будет.
з.ы. Тем паче в автолиспе функцию проверяющию ВСЕ не напишешь - как минимум количество аргументов проверить не возможно - и (test) или (test 1 2) - закончится аналогичным результатом.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 24.03.2012, 01:27
#6
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Дима_, дело не в этом, ваши примеры вызовут ошибку, и это нормально, а мой вызовет переполнение стека (Тяжелая ошибка), логически /= слишом хлипкая затычка между положительными и отрицательными числами
gomer вне форума  
 
Автор темы   Непрочитано 24.03.2012, 10:20
#7
M_konst


 
Регистрация: 13.03.2009
Сообщений: 26


Забыл добавить что количество точечных пар в списке заранее неизвестно (т.е. перем j не постоянна). Поэтому я включил все в цикл.
M_konst вне форума  
 
Непрочитано 24.03.2012, 10:32
#8
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от M_konst Посмотреть сообщение
количество точечных пар в списке заранее неизвестно
Тогда уточните задачу и откуда берете исходные данные
gomer вне форума  
 
Автор темы   Непрочитано 27.03.2012, 11:58
#9
M_konst


 
Регистрация: 13.03.2009
Сообщений: 26


Благодорю что откликнулись. Вопрос снят. Догадался......
Получилось вот что:
Код:
[Выделить все]
 
  (setq mm '(1 . 0) kk 2 j 3)
  (repeat j
    (setq mm1 (cons (eval kk) 0))
    (setq mm (list mm mm1))
    (setq kk (1+ kk))
  )  
M_konst вне форума  
 
Непрочитано 27.03.2012, 17:47
#10
CB

Конструирование в области нефтеразведки
 
Регистрация: 10.02.2006
Гомель
Сообщений: 321


Цитата:
хочу создать список типа:
((1 . 0) (2 . 0) (3 . 0))

Получилось вот что:
((((1 . 0) (2 . 0)) (3 . 0)) (4 . 0))
Код:
[Выделить все]
(setq j 3)
(mapcar '(lambda (x) (cons x 0))
        ((lambda (j / lst)
           (repeat j
             (setq lst (cons j lst)
                   j   (1- j)
             ) ;_ end of setq
           ) ;_ end of repeat
           lst
         ) ;_ end of lambda
          j
        )
) ;_ end of mapcar
__________________
Никогда не спорьте с дураками - они опустят Вас до своего уровня и победят за счет опыта
CB вне форума  
 
Непрочитано 27.03.2012, 18:55
#11
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


хочется орать благим матом за такое ВНИМАТЕЛЬНО, смотрите #3
gomer вне форума  
 
Непрочитано 27.03.2012, 19:51
#12
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Ну и чтоб совсем запутать
Код:
[Выделить все]
 (defun test (x) (if (/= x 0) (cons (cons x 0) (test (1- x)))))
пример запуска (reverse (test 10))
Совет на будущее
Чтобы не добавлять костыль в виде реверса в рекурсивные
используй APPEND вместо CONS

Код:
[Выделить все]
(defun ncons (x)
  (if (not (minusp x))
    (append (ncons (1- x))(list (cons x 0)))
    )
  )
~'o'~
Олег (jr.) вне форума  
 
Непрочитано 27.03.2012, 20:10
#13
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от Олег (jr.) Посмотреть сообщение
Чтобы не добавлять костыль в виде реверса в рекурсивные
используй APPEND вместо CONS
Спасибо за желание помочь - но Ваш совет, как бы это помягче сказать, меня немножко расстраивает. Расстраивает тем, что Вы написали не одну "программку" для "молодых" и не только формучан, опыт в этом деле у Вас есть, но ОСНОВЫ лиспа у Вас сильно хромают. Списки это НЕ массивы, сложение (append) списков a1 и a2 происходит за количество операций равное количеству элементов в a1 (которые еще надо выcarиривать из списка). И делать это в цикле, мягко говоря не рационально (Вам не приходило в голову, почему листописатели, не догадались сделать такую простую и удобную функцию, как добавление элемента в конец списка). Вобщем изучите вопрос - то что Вы предлагаете - не используйте - это не костыли, а инвалидная коляска.
з.ы.
Вот так "логически" выгядит append
Код:
[Выделить все]
 (defun my-append(a1 a2)
  (if a1
      (cons (car a1) (my-append (cdr a1) a2))
      a2))
з.з.ы. Погоняйте Ваш подход на больших списках - секундомер, чтоб увидеть разницу, не понадобится.
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 27.03.2012 в 20:25.
Дима_ вне форума  
 
Непрочитано 27.03.2012, 20:31
#14
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Спасибо за желание помочь - но Ваш совет, как бы это помягче сказать
дело хозяйское, это был только совет
полемика закрыта,
успехов

~'o'~
Олег (jr.) вне форума  
 
Непрочитано 27.03.2012, 20:34
#15
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


о чем спор, если есть assoc?
gomer вне форума  
 
Непрочитано 12.02.2019, 11:29
#16
tujn08


 
Регистрация: 26.12.2013
Сообщений: 283


Привет!
подскажите как создать и редактировать списки вида:
Код:
[Выделить все]
 (1 . ("данные1" "данные2"))
tujn08 вне форума  
 
Непрочитано 12.02.2019, 11:43
#17
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,817


никак. у точечной пары второй аргумент не может быть списком.
koMon вне форума  
 
Непрочитано 12.02.2019, 11:53
1 | 1 #18
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450


Фигню написал... Вот верное:
Код:
[Выделить все]
 (setq lst '((1 ("data1" "data2")) (2 ("data3" "data4")) (3 "data5" "data6")))
(cdr (assoc 1 lst))
(cdr (assoc 3 lst))
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 12.02.2019, 12:38
#19
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,817


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
(setq lst '((1 ("data1" "data2")) (2 ("data3" "data4")) (3 "data5" "data6")))
и в каком же месте здесь можно обнаружить точечный список (пару)? или может тема про вложенные списки?
koMon вне форума  
 
Непрочитано 12.02.2019, 12:56
#20
tujn08


 
Регистрация: 26.12.2013
Сообщений: 283


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Вот верное:
точно! без точки- забыл совсем )))

----- добавлено через ~10 мин. -----
Цитата:
Сообщение от koMon Посмотреть сообщение
или может тема про вложенные списки?
цель про простой/быстрый доступ к спискам.
tujn08 вне форума  
 
Непрочитано 12.02.2019, 14:05
#21
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450


koMon, в принципе список - точечная пара, в которой первый элемент атом, а второй - список. По крайней мере assoc корректно работает
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 12.02.2019, 15:23
#22
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,817


Кулик Алексей aka kpblc,
вот только не надо этого пионерского лукавства) готов налить тебе стакан, когда буду в Питере, если ты вот сейчас здесь предоставишь лисп который создаст точечную пару со вторым аргументом - списком)

----- добавлено через ~2 мин. -----
да и кстати tc запрашивал
Цитата:
Сообщение от tujn08 Посмотреть сообщение
(1 . ("данные1" "данные2"))
Миниатюры
Нажмите на изображение для увеличения
Название: DP.jpg
Просмотров: 58
Размер:	82.8 Кб
ID:	210935  
koMon вне форума  
 
Непрочитано 12.02.2019, 15:36
#23
tujn08


 
Регистрация: 26.12.2013
Сообщений: 283


Всем спасибо! Алексею особенно.

Вот, что получилось:
tujn08 вне форума  
 
Непрочитано 15.02.2019, 00:44
#24
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от koMon Посмотреть сообщение
вот только не надо этого пионерского лукавства) готов налить тебе стакан, когда буду в Питере, если ты вот сейчас здесь предоставишь лисп который создаст точечную пару со вторым аргументом - списком
Это любой не пустой список. Учите матчасть.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 15.02.2019, 09:34
#25
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,817


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Учите матчасть
ну да, ну да
Миниатюры
Нажмите на изображение для увеличения
Название: Pzh.jpg
Просмотров: 80
Размер:	12.6 Кб
ID:	211018  
koMon вне форума  
 
Непрочитано 16.02.2019, 01:54
#26
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


С Вашего позволения начну...
В лиспе данные (оно же как и код - так как в нем это одно и то-же) связываются только 1 способом - парами - то есть устанавливается связь - ячейка 1 (в которой может находится любой тип данных, включая другую пару) связанна с ячейкой 2. Для удобства пользования создан тип данных "конец списка" который можно равнозначно обозначить nil или '() (в автолиспе он же используется как значение false в булевых операциях). То есть, например, список из 5-ти элементов 1..5 это не что иное как (cons 1 (cons 2 (cons 3 (cons 4 (cons 5 nil))))) или (cons 1 (cons 2 (cons 3 (cons 4 (cons 5 '()))))). Для удобства есть функция (list ...) которая переводит аргументы во вложенные последовательности пар; опять-же для лучшего восприятия последовательно вложенные пары с "концом" из nil отображаются как список - (a b c ...).
Прочитав внимательно раза 2 - Вы поймете, что с Вашим примером все верно, в первом варианте вернулось значение, во втором список - как и должно быть, то есть любой не пустой список - это и есть пара из "головы" (car ...) и хвоста (cdr ...) - где (cdr ...) это список или '().
Все функции обработки списков (то есть вообще все функции т.к. функция с аргументами, да и без них - так-же представлена в виде списков) раскладываются в итоге на car-cdr - по иному до n-ого элемента списка не добраться.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 16.02.2019, 06:26
#27
Семёныч


 
Регистрация: 08.12.2018
Сообщений: 164


Цитата:
Сообщение от Дима_ Посмотреть сообщение
раскладываются в итоге на car-cdr - по иному до n-ого элемента списка не добраться.
А как же функция (nth)?
Семёныч вне форума  
 
Непрочитано 16.02.2019, 11:56
#28
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от Семёныч Посмотреть сообщение
А как же функция (nth)?
насколько понял в свое время: список акада представляют собой однонаправленный связанный список из так называемых cons ячеек, где car выдает ссылку на значение текущей ячейки cons, а cdr - ссылку на следующую ячейку. И тогда получается, что функция nth представляет собой по сути цикл пробегания по ссылкам списка, начиная каждый раз с первого элемента - что не совсем хорошо в плане производительности.
Сергей812 вне форума  
 
Непрочитано 17.02.2019, 10:23
#29
rebus


 
Регистрация: 20.04.2014
Сообщений: 38


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
koMon, в принципе список - точечная пара, в которой первый элемент атом, а второй - список. По крайней мере assoc корректно работает
Точнее - первый элемент либо атом, либо точечная пара.

----- добавлено через ~29 мин. -----
Цитата:
Сообщение от koMon Посмотреть сообщение
никак. у точечной пары второй аргумент не может быть списком.
Второй элемент точечной пары может быть точечной парой, а список - это частный случай точечной пары. А вот аргументов у точечных пар нет.
rebus вне форума  
 
Непрочитано 18.02.2019, 10:48
#30
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,817


Цитата:
Сообщение от rebus Посмотреть сообщение
А вот аргументов у точечных пар нет.
это верно! это косяк!

НО если всё же попытаться вернутся к напечатанному
Цитата:
Сообщение от tujn08 Посмотреть сообщение
подскажите как создать и редактировать списки вида:
Код:
[Выделить все]
 (1 . ("данные1" "данные2"))
Цитата:
Сообщение от koMon Посмотреть сообщение
никак. у точечной пары второй аргумент элемент (поправка от rebus) не может быть списком.
то об чём собственно спор?
koMon вне форума  
 
Непрочитано 18.02.2019, 11:32
#31
frostmourn


 
Регистрация: 23.04.2015
Сообщений: 163


Так можно
Код:
[Выделить все]
 
'(1 . "(\"данные1\" \"данные2\")")
(read(cdr '(1 . "(\"данные1\" \"данные2\")")))
> ("данные1" "данные2")
frostmourn вне форума  
 
Непрочитано 18.02.2019, 12:25
#32
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450


Это читать, а не создавать и редактировать
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 18.02.2019, 17:58
#33
rebus


 
Регистрация: 20.04.2014
Сообщений: 38


Цитата:
Сообщение от koMon Посмотреть сообщение
то об чём собственно спор?
Ну, о том, что пару, у которой в cdr список сделать можно, только стандартная лисповская печаталка не показывает перед парой точку, поэтому покажет ее как обычный список.
rebus вне форума  
 
Непрочитано 18.02.2019, 19:06
#34
Семёныч


 
Регистрация: 08.12.2018
Сообщений: 164


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
насколько понял в свое время
По-моему, не совсем так ты понял все это применительно к функции (nth <n> <список>).
Однако, я обращался к Дима_, поскольку именно он достаточно категорически заявил, что кроме, как с помощью CAR и CDR нет возможности добраться до любого элемента списка:
Цитата:
Сообщение от Дима_ Посмотреть сообщение
раскладываются в итоге на car-cdr - по иному до n-ого элемента списка не добраться
Семёныч вне форума  
 
Непрочитано 18.02.2019, 19:53
#35
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Цитата:
Сообщение от Семёныч Посмотреть сообщение
По-моему, не совсем так ты понял все это применительно к функции (nth <n> <список>).
Однако, я обращался к Дима_, поскольку именно он достаточно категорически заявил, что кроме, как с помощью CAR и CDR нет возможности добраться до любого элемента списка:
В "базовом" LISP действительно нет функции NTH, а Дима_ как раз его "правоверный" сторонник. Базисными функциями для списков являются CAR, CDR, CONS.

Но LISP легко расширяется и имеет множество диалектов. Вот в Autolisp ввели удобную функцию NTH. Она действительно в цикле перебирает список и работает медленней. Но это совершенно не критично по скорости, зато очень удобно. Попробуйте-ка "обезличненно" только с использованием базовых функций добраться до элемента списка с известным номером.

А для прикладного программирования приходится еще больше расширять. Вот у меня, например, еще 22 функции для работы со списками. Они позволяют быстро писать простые конечные программы.
ShaggyDoc вне форума  
 
Непрочитано 18.02.2019, 20:44
#36
rebus


 
Регистрация: 20.04.2014
Сообщений: 38


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Вот в Autolisp ввели удобную функцию NTH.
Есть конечно некоторое удобство и польза, если не просить ее вытаскивать слишком далекие элементы из списка, скажем, дальше 10-го элемента, особенно - в цикле.
Но как абстракция, представляющая список в виде массива, она вредна. Списки - не массивы, с ними по-другому надо работать.
rebus вне форума  
 
Непрочитано 18.02.2019, 21:12
#37
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Цитата:
Сообщение от rebus Посмотреть сообщение
Но как абстракция, представляющая список в виде массива, она вредна. Списки - не массивы, с ними по-другому надо работать.
Это уже религиозный вопрос
ShaggyDoc вне форума  
 
Непрочитано 18.02.2019, 21:47
#38
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,817


Цитата:
Сообщение от rebus Посмотреть сообщение
Ну, о том, что пару, у которой в cdr список сделать можно
это дежавю что ли? да это не точечная пара будет, а тупо любой список, с количеством элементов больше одного, поскольку для него cdr возвращает оставшийся список начиная со второго элемента.
возврашаясь к ac хелпу: списки в виде точечных пар всегда состоят из двух элементов и используются автолиспом для манипулирования составными данными примитивов. в точечной паре элементы списка разделяются точкой (.).большинство функций для работы со списками не принимают в качестве аргумента точечную пару, поэтому вам нужно точно понимать, что вы передаёте функции корректный список. точечная пара является примером "неправильного" списка, у которого последния cdr не является nil. функция cons в дополнение к добавлению нового элемента в начало списка может создавать точечную пару. если второй аргумент для функции cons является любым типом, кроме списка или nil, то создаётся точечная пара.
koMon вне форума  
 
Непрочитано 19.02.2019, 02:00
#39
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от koMon Посмотреть сообщение
возврашаясь к ac хелпу:
Эта цитата не дает ничего кроме неверного представления, "списки в виде точечных пар" - трындец. Еще раз - все списочные функции? что nth, что member что assoc и другие - выражены через car и cdr - список - это всегда набор связанных указателей на данные, но не сами данные - когда мы "складываем" данные в список - с ними не происходит ничего - они остаются там-же где лежали - просто создается структура в которой они перечислены. В автолиспе вообще нет способа изменить данные (setq xxx yyy) просто создает новую ячейку xxx - возможно, таким образом "убивая" последнею возможность доступа к существующей одноименной, которая, в этом случае, будет "похоронена" ближайшим сборщиком мусора (GC).
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 19.02.2019, 06:52
#40
Семёныч


 
Регистрация: 08.12.2018
Сообщений: 164


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
В "базовом" LISP действительно нет функции NTH, а Дима_ как раз его "правоверный" сторонник. Базисными функциями для списков являются CAR, CDR, CONS.
Но LISP легко расширяется и имеет множество диалектов. Вот в Autolisp ввели удобную функцию NTH.
Так речь ведь как раз и идет об AutoLisp. Посмотрите название темы: Точечные списки в AutoLisp.
Тем не менее, чей бы сторонник не был Дима_, ответить на мой вопрос он не пожелал, зато условные адвокаты постарались.
Семёныч вне форума  
 
Непрочитано 19.02.2019, 12:06
#41
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от Семёныч Посмотреть сообщение
Тем не менее, чей бы сторонник не был Дима_, ответить на мой вопрос он не пожелал, зато условные адвокаты постарались.
Просто вы, занимаясь самолюбованием, не смогли понять одной простой мысли, которую до вас пытались донести - лисп является списочным языком с последовательной обработкой данных в списке. Этим он и сложен для тех, кто привык на других языках писать - так как надо перестраивать подход к проектированию архитектуры программ и написанию самого кода.
Сергей812 вне форума  
 
Непрочитано 19.02.2019, 15:44
#42
rebus


 
Регистрация: 20.04.2014
Сообщений: 38


Цитата:
Сообщение от koMon Посмотреть сообщение
да это не точечная пара будет, а тупо любой список
Список реализуется как точечная пара, у которой car указывает либо на атом, либо на точечную пару, а cdr указывает на другой список.

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

Цитата:
функция cons в дополнение к добавлению нового элемента в начало списка может создавать точечную пару. если второй аргумент для функции cons является любым типом, кроме списка или nil, то создаётся точечная пара.
Функция cons не добавляет элемент в начало списка. Да, когда консоль печатает возвращаемое cons значение, это может выглядеть так, будто cons добавляет элемент в начало списка, но на самом деле cons всегда создает точечную пару, у которой car указывает на первый аргумент, а cdr - на второй.
rebus вне форума  
 
Непрочитано 19.02.2019, 16:51
#43
frostmourn


 
Регистрация: 23.04.2015
Сообщений: 163


Цитата:
Сообщение от koMon Посмотреть сообщение
это дежавю что ли? да это не точечная пара будет, а тупо любой список, с количеством элементов больше одного,
Руками именно вот такой, с точкой, кстати, можно ввести, и работать с car/cdr будет.
frostmourn вне форума  
 
Непрочитано 19.02.2019, 19:36
#44
ciril

САПР
 
Регистрация: 29.09.2011
СПб
Сообщений: 283


rebus, а я стесняюсь спросить, откуда точная инфа по внутреннему представлению списков в vlisp и как оно на самом деле?
__________________
На работе было скучно:shout:

Последний раз редактировалось ciril, 19.02.2019 в 20:13.
ciril вне форума  
 
Непрочитано 20.02.2019, 15:44
#45
rebus


 
Регистрация: 20.04.2014
Сообщений: 38


Цитата:
Сообщение от ciril Посмотреть сообщение
rebus, а я стесняюсь спросить, откуда точная инфа по внутреннему представлению списков в vlisp и как оно на самом деле?
Это во всех реализациях лиспа так: Of the many data structures that can be built out of cons cells, one of the most basic is called a proper list. A proper list is either the special nil (empty list) symbol, or a cons in which the car points to a datum (which may be another cons structure, such as a list), and the cdr points to another proper list., вряд ли автолисп исключение. Но не стесняйтесь, докажите что в автолиспе списки реализованы не на парах.
rebus вне форума  
 
Непрочитано 20.02.2019, 18:15
#46
ciril

САПР
 
Регистрация: 29.09.2011
СПб
Сообщений: 283


Ну я постесняюсь в качестве доказательства приводить ссылку на википедию - стандарт языка из нее так себе.
Процитирую "Common Lisp the Language, 2nd edition" 2.4:
Как бы да, "A list is recursively defined to be either the empty list or a cons whose cdr component is a list.", но определяется - не значит реализовывается, но это так, к слову.
А вообще: A dotted list is one whose last cons does not have nil for its cdr, rather some other data object (which is also not a cons, or the first-mentioned cons would not be the last cons of the list). Such a list is called ``dotted'' because of the special notation used for it: the elements of the list are written between parentheses as before, but after the last element and before the right parenthesis are written a dot (surrounded by blank space) and then the cdr of the last cons. As a special case, a single cons is notated by writing the car and the cdr between parentheses and separated by a space-surrounded dot.
Но это в стандарте Common Lisp, поддержка которого vlisp на заявляется. Как пример разниц реализаций с sbcl
Хотя
(length '(1 2 . 3))
sbcl => The value 3 is not of type LIST
vlide => неверный список: 3
Но
(last '(1 2 . 3))
sbcl => (2 . 3)
vlide => неверный список: 3
Учитывая многообразие диалектов лиспа, я не стал бы говорить, я не стал бы говорить про все реализации лиспа, но в общем, vlide гораздо ближе к emacs lisp, чем к стандартизированному.
__________________
На работе было скучно:shout:

Последний раз редактировалось ciril, 20.02.2019 в 18:40. Причина: К тому же
ciril вне форума  
 
Непрочитано 20.02.2019, 19:46
#47
rebus


 
Регистрация: 20.04.2014
Сообщений: 38


Цитата:
Сообщение от ciril Посмотреть сообщение
Ну я постесняюсь в качестве доказательства приводить ссылку на википедию - стандарт языка из нее так себе.
Процитирую "Common Lisp the Language, 2nd edition" 2.4:
Но первую строчку из 2.4 процитировать постеснялся: " A cons is a record structure containing two components called the car and the cdr. Conses are used primarily to represent lists."

Цитата:
Как бы да, "A list is recursively defined to be either the empty list or a cons whose cdr component is a list.", но определяется - не значит реализовывается, но это так, к слову.
Там следом как раз про реализацию: "A list is therefore a chain of conses linked by their cdr components and terminated by nil, the empty list."

Цитата:
я не стал бы говорить про все реализации лиспа, но в общем, vlide гораздо ближе к emacs lisp, чем к стандартизированному.
emacs lisp тоже не оригинальничает в этом вопросе: "Lists in Lisp are not a primitive data type; they are built up from cons cells".

Итого: любой список, будь он правильный или неправильный, это цепочка пар. Аргументами в функции передается указатель на его первую пару. Значит, всякий список, в первую очередь - это пара.
rebus вне форума  
 
Непрочитано 21.02.2019, 00:24
#48
ciril

САПР
 
Регистрация: 29.09.2011
СПб
Сообщений: 283


rebus, создаётся впечатление, что вы считаете, что dotted list и cons cell - одно и то же.
__________________
На работе было скучно:shout:
ciril вне форума  
 
Непрочитано 21.02.2019, 19:09
#49
rebus


 
Регистрация: 20.04.2014
Сообщений: 38


Цитата:
Сообщение от ciril Посмотреть сообщение
rebus, создаётся впечатление, что вы считаете, что dotted list и cons cell - одно и то же.
Я считаю, что любой список на самом деле, "под капотом", является парой, у которой car указывает на первый элемент, а cdr - на оставшуюся часть.
rebus вне форума  
 
Непрочитано 21.02.2019, 23:05
#50
Massaraksh

Delphi, Assembler, PHP, VB, Lisp с 01.02.2019
 
Регистрация: 10.02.2019
Воронеж
Сообщений: 30


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
насколько понял в свое время: список акада представляют собой однонаправленный связанный список из так называемых cons ячеек, где car выдает ссылку на значение текущей ячейки cons, а cdr - ссылку на следующую ячейку. И тогда получается, что функция nth представляет собой по сути цикл пробегания по ссылкам списка, начиная каждый раз с первого элемента - что не совсем хорошо в плане производительности.
Вообще-то, никто, кроме разработчиков, не знает, как это организовано внутри. В списках с высокой вероятностью располагаются индексные поля для удобства разработчиков и для повышения скорости работы.
По крайней мере, сейчас проверил nth на дальней части списка из 3000000 записей - результат получил мгновенно, хотя сам список формировался около 8 секунд.
Massaraksh вне форума  
 
Непрочитано 21.02.2019, 23:24
#51
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от Massaraksh Посмотреть сообщение
Вообще-то, никто, кроме разработчиков, не знает, как это организовано внутри. В списках с высокой вероятностью располагаются индексные поля для удобства разработчиков и для повышения скорости работы.
По крайней мере, сейчас проверил nth на дальней части списка из 3000000 записей - результат получил мгновенно, хотя сам список формировался около 8 секунд.
Все может быть. Но даже 3 млн раз по ссылке пройти в списке на более-менее современных компах не должно занять столько времени - чтобы пользователь это заметил. А вот если эту операцию загнать в цикл с количеством итерации этак 1000 - то там уже будет явно заметно: последовательно проходит по списку или сразу обращается к нужной ячейке.
Сергей812 вне форума  
 
Непрочитано 21.02.2019, 23:42
#52
Massaraksh

Delphi, Assembler, PHP, VB, Lisp с 01.02.2019
 
Регистрация: 10.02.2019
Воронеж
Сообщений: 30


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
А вот если эту операцию загнать в цикл с количеством итерации этак 1000...
16 секунд. Надо ещё учесть, что это интерпретатор.

----- добавлено через ~9 мин. -----
А сейчас попробовал в начале списка - менее секунды. Да, действительно перебирает подряд. Косяк разработчиков.
Massaraksh вне форума  
 
Непрочитано 22.02.2019, 00:16
#53
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от Massaraksh Посмотреть сообщение
Да, действительно перебирает подряд. Косяк разработчиков.
Зато операции с модификацией списков быстрее должны проходить. Не надо сдвигать при операциях вставки/удаления последующие элементы, как в случае классического массива.
Сергей812 вне форума  
 
Непрочитано 22.02.2019, 00:23
#54
Massaraksh

Delphi, Assembler, PHP, VB, Lisp с 01.02.2019
 
Регистрация: 10.02.2019
Воронеж
Сообщений: 30


Ну да, у списков свои преимущества, у массивов - свои. Но, как по мне, это всё эстетство (в смысле, рассуждать о том, что лучше, что хуже). Решать задачу надо теми инструментами, которые лучше всего подходят для этой задачи.
Massaraksh вне форума  
 
Непрочитано 23.02.2019, 17:06
#55
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от Семёныч Посмотреть сообщение
ответить на мой вопрос он не пожелал
Вот это да, по моему я уже 2 раза ответил, да и до вопроса, в приведенной цитате было написано.
Цитата:
А как же функция (nth)?
Ровно так-же как и все другие (nth i lst)- это цикл из i cdr-итераций по списку lst и получение car элемента последнего. Она не имеет ничего общего (ну кроме кажущийся схожести для не сильно вдумчивых программистов) с аналогичным извлечением по индексу из массивов в других языках (или через vlax-safearray-get-element) - не вычислить нахождение элемента списка в памяти (и соответственно не получить его значение) не прошагав до него cdr'ами.

p.s. - по поводу замеров производительности - не смущает что сравнивается скомпилированная функцию и работа интерпритатора.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Точечные списки в AutoLisp



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Квадрантное представление окружности на AutoLISP v1talka LISP 39 29.02.2012 14:25
Литература по AutoLisp и VBA для приложений M_konst LISP 5 29.08.2009 17:32
Как отладить нейтив и менеджед код в COM объекте который используется из AutoLISP? lexluther LISP 1 12.08.2009 08:37
Параметрическая библиотека в autoLISP joisegatoi LISP 8 18.06.2007 18:39
Как из Delphi запустить программу на AutoLISP Valery LISP 1 23.09.2005 20:51