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

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

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

Ответ
Поиск в этой теме
Непрочитано 23.03.2012, 15:10
Точечные списки в 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-й день.
Просмотров: 11233
 
Непрочитано 19.02.2019, 12:06
#41
Сергей812


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


Цитата:
Сообщение от Семёныч Посмотреть сообщение
Тем не менее, чей бы сторонник не был Дима_, ответить на мой вопрос он не пожелал, зато условные адвокаты постарались.
Просто вы, занимаясь самолюбованием, не смогли понять одной простой мысли, которую до вас пытались донести - лисп является списочным языком с последовательной обработкой данных в списке. Этим он и сложен для тех, кто привык на других языках писать - так как надо перестраивать подход к проектированию архитектуры программ и написанию самого кода.
Сергей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,041


Цитата:
Сообщение от 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,041


Цитата:
Сообщение от 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,840


Цитата:
Сообщение от Семёныч Посмотреть сообщение
ответить на мой вопрос он не пожелал
Вот это да, по моему я уже 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