Реклама 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-й день.
Просмотров: 11231
 
Непрочитано 12.02.2019, 14:05
#21
Кулик Алексей aka kpblc
Moderator

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


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


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


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

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


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


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

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

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


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


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


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

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


С Вашего позволения начну...
В лиспе данные (оно же как и код - так как в нем это одно и то-же) связываются только 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,041


Цитата:
Сообщение от Семёныч Посмотреть сообщение
А как же функция (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,680


Цитата:
Сообщение от 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
С.-Петербург
Сообщений: 39,844


Это читать, а не создавать и редактировать
__________________
Моя библиотека 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,381


Цитата:
Сообщение от Семёныч Посмотреть сообщение
По-моему, не совсем так ты понял все это применительно к функции (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,381


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


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


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

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


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