|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
Точечные списки в AutoLisp
Регистрация: 13.03.2009
Сообщений: 26
|
||
Просмотров: 12095
|
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
А так же (test nil) (test "10") (test '10) - это функция для ПРОГРАММИСТА которая предполагает "правильные" аргументы, их соответствие надо проверять при получении (вводе пользователя, чтении и.т.д), иначе программа из одних проверок состоять будет.
з.ы. Тем паче в автолиспе функцию проверяющию ВСЕ не напишешь - как минимум количество аргументов проверить не возможно - и (test) или (test 1 2) - закончится аналогичным результатом.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Конструирование в области нефтеразведки Регистрация: 10.02.2006
Гомель
Сообщений: 321
|
Цитата:
Код:
__________________
Никогда не спорьте с дураками - они опустят Вас до своего уровня и победят за счет опыта |
|||
![]() |
|
||||
специалист по околачиванию грушевых деревьев Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811
|
|
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Цитата:
з.ы. Вот так "логически" выгядит append Код:
__________________
Когда в руках молоток все вокруг кажется гвоздями. Последний раз редактировалось Дима_, 27.03.2012 в 20:25. |
|||
![]() |
|
||||
никак. у точечной пары второй аргумент не может быть списком.
|
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450
|
Фигню написал... Вот верное:
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
|
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450
|
koMon, в принципе список - точечная пара, в которой первый элемент атом, а второй - список. По крайней мере assoc корректно работает
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Кулик Алексей aka kpblc,
вот только не надо этого пионерского лукавства) готов налить тебе стакан, когда буду в Питере, если ты вот сейчас здесь предоставишь лисп который создаст точечную пару со вторым аргументом - списком) ----- добавлено через ~2 мин. ----- да и кстати tc запрашивал |
||||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Это любой не пустой список. Учите матчасть.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
|
||||
![]() |
|
||||
Продуман Регистрация: 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-ого элемента списка не добраться.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
насколько понял в свое время: список акада представляют собой однонаправленный связанный список из так называемых cons ячеек, где car выдает ссылку на значение текущей ячейки cons, а cdr - ссылку на следующую ячейку. И тогда получается, что функция nth представляет собой по сути цикл пробегания по ссылкам списка, начиная каждый раз с первого элемента - что не совсем хорошо в плане производительности.
|
|||
![]() |
|
||||
Регистрация: 20.04.2014
Сообщений: 38
|
Цитата:
----- добавлено через ~29 мин. ----- Второй элемент точечной пары может быть точечной парой, а список - это частный случай точечной пары. А вот аргументов у точечных пар нет. |
|||
![]() |
|
||||
это верно! это косяк!
![]() НО если всё же попытаться вернутся к напечатанному Цитата:
![]() |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450
|
Это читать, а не создавать и редактировать
![]()
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 08.12.2018
Сообщений: 164
|
По-моему, не совсем так ты понял все это применительно к функции (nth <n> <список>).
Однако, я обращался к Дима_, поскольку именно он достаточно категорически заявил, что кроме, как с помощью CAR и CDR нет возможности добраться до любого элемента списка: |
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Цитата:
Но LISP легко расширяется и имеет множество диалектов. Вот в Autolisp ввели удобную функцию NTH. Она действительно в цикле перебирает список и работает медленней. Но это совершенно не критично по скорости, зато очень удобно. Попробуйте-ка "обезличненно" только с использованием базовых функций добраться до элемента списка с известным номером. А для прикладного программирования приходится еще больше расширять. Вот у меня, например, еще 22 функции для работы со списками. Они позволяют быстро писать простые конечные программы. |
|||
![]() |
|
||||
Регистрация: 20.04.2014
Сообщений: 38
|
Есть конечно некоторое удобство и польза, если не просить ее вытаскивать слишком далекие элементы из списка, скажем, дальше 10-го элемента, особенно - в цикле.
Но как абстракция, представляющая список в виде массива, она вредна. Списки - не массивы, с ними по-другому надо работать. |
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
|
|||
![]() |
|
||||
это дежавю что ли? да это не точечная пара будет, а тупо любой список, с количеством элементов больше одного, поскольку для него cdr возвращает оставшийся список начиная со второго элемента.
возврашаясь к ac хелпу: списки в виде точечных пар всегда состоят из двух элементов и используются автолиспом для манипулирования составными данными примитивов. в точечной паре элементы списка разделяются точкой (.).большинство функций для работы со списками не принимают в качестве аргумента точечную пару, поэтому вам нужно точно понимать, что вы передаёте функции корректный список. точечная пара является примером "неправильного" списка, у которого последния cdr не является nil. функция cons в дополнение к добавлению нового элемента в начало списка может создавать точечную пару. если второй аргумент для функции cons является любым типом, кроме списка или nil, то создаётся точечная пара. |
||||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Эта цитата не дает ничего кроме неверного представления, "списки в виде точечных пар" - трындец. Еще раз - все списочные функции? что nth, что member что assoc и другие - выражены через car и cdr - список - это всегда набор связанных указателей на данные, но не сами данные - когда мы "складываем" данные в список - с ними не происходит ничего - они остаются там-же где лежали - просто создается структура в которой они перечислены. В автолиспе вообще нет способа изменить данные (setq xxx yyy) просто создает новую ячейку xxx - возможно, таким образом "убивая" последнею возможность доступа к существующей одноименной, которая, в этом случае, будет "похоронена" ближайшим сборщиком мусора (GC).
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Регистрация: 08.12.2018
Сообщений: 164
|
Цитата:
Тем не менее, чей бы сторонник не был Дима_, ответить на мой вопрос он не пожелал, зато условные адвокаты постарались. ![]() |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
Просто вы, занимаясь самолюбованием, не смогли понять одной простой мысли, которую до вас пытались донести - лисп является списочным языком с последовательной обработкой данных в списке. Этим он и сложен для тех, кто привык на других языках писать - так как надо перестраивать подход к проектированию архитектуры программ и написанию самого кода.
|
|||
![]() |
|
||||
Регистрация: 20.04.2014
Сообщений: 38
|
Список реализуется как точечная пара, у которой car указывает либо на атом, либо на точечную пару, а cdr указывает на другой список.
Цитата:
Цитата:
|
|||
![]() |
|
||||
Регистрация: 20.04.2014
Сообщений: 38
|
Цитата:
|
|||
![]() |
|
||||
САПР Регистрация: 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. Причина: К тому же |
|||
![]() |
|
||||
Регистрация: 20.04.2014
Сообщений: 38
|
Цитата:
Цитата:
Цитата:
Итого: любой список, будь он правильный или неправильный, это цепочка пар. Аргументами в функции передается указатель на его первую пару. Значит, всякий список, в первую очередь - это пара. |
|||
![]() |
|
||||
Регистрация: 20.04.2014
Сообщений: 38
|
|
|||
![]() |
|
||||
Delphi, Assembler, PHP, VB, Lisp с 01.02.2019 Регистрация: 10.02.2019
Воронеж
Сообщений: 30
|
Цитата:
По крайней мере, сейчас проверил nth на дальней части списка из 3000000 записей - результат получил мгновенно, хотя сам список формировался около 8 секунд. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
Цитата:
|
|||
![]() |
|
||||
Delphi, Assembler, PHP, VB, Lisp с 01.02.2019 Регистрация: 10.02.2019
Воронеж
Сообщений: 30
|
Цитата:
----- добавлено через ~9 мин. ----- А сейчас попробовал в начале списка - менее секунды. Да, действительно перебирает подряд. Косяк разработчиков. |
|||
![]() |
|
||||
Регистрация: 10.08.2013
Сообщений: 11,499
|
|
|||
![]() |
|
||||
Delphi, Assembler, PHP, VB, Lisp с 01.02.2019 Регистрация: 10.02.2019
Воронеж
Сообщений: 30
|
Ну да, у списков свои преимущества, у массивов - свои. Но, как по мне, это всё эстетство (в смысле, рассуждать о том, что лучше, что хуже). Решать задачу надо теми инструментами, которые лучше всего подходят для этой задачи.
|
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Вот это да, по моему я уже 2 раза ответил, да и до вопроса, в приведенной цитате было написано.
Цитата:
p.s. - по поводу замеров производительности - не смущает что сравнивается скомпилированная функцию и работа интерпритатора.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
![]() |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Квадрантное представление окружности на 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 |