|
||
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны | Справка по форуму | Файлообменник | |
|
Поиск в этой теме |
|
||||
Регистрация: 10.01.2020
Сообщений: 171
|
posetitel, для получения текста из ячейки используй nentsel.
А для создания слоя уже на форуме было - https://forum.dwg.ru/showthread.php?t=80531 |
|||
|
||||
Регистрация: 17.01.2014
Сообщений: 97
|
Привет всем!
Есть задача - сформировать новый список на основе другого списка, в соответствии с заданным целым числом. Число - количество элементов исходного списка, идущих от его начала. Таким образом, если мы передадим в функцию, в качестве аргументов, число 3 и список '(1 2 3 4 5 6), функция должна будет вернуть нам '(1 2 3). В свое время, написал для решения этой задачи итеративную функцию: Код:
Код:
|
|||
|
||||
Регистрация: 17.01.2014
Сообщений: 97
|
koMon, круто, спасибо. Теперь все встало на свои места.
Сразу не допер, что (cons (car нужно применять не к списку, а к рекурсии возвращающей список. С твоего позволения, немного модифицировал твой код, убрав из него ненужные setq, так как аргументы входящие в функцию рекурсивно, сами меняют свое значение при каждом новом вызове функции (разумеется, если изменение значения аргумента прописано в теле функции). Итого, получилось: Код:
|
|||
|
||||
Регистрация: 15.08.2005
г. Норильск
Сообщений: 451
|
Маленькое примечание.
Рекурсию при обработке списков нужно использовать очень осторожно - можно натолкнуться на "переполнение стека". Если список очень большой. Такие ошибки очень трудно потом отлавливать. Я, например, в принципе отказался от неё при обработке списков непредсказуемой длины. foreach - "наше всё" :-)
__________________
Счастливо, Алексей! |
|||
|
||||
Регистрация: 17.01.2014
Сообщений: 97
|
===AAA===
Безусловно, такая проблема существует. Но на практике, со stack overflow пока не сталкивался, возможно по причине того, что рекурсивные функции использую не так часто. При этом, неоднократно сталкивался с мнением, что LISP, это как раз тот язык, из всех прочих языков, где рекурсивные алгоритмы перебора списков (коллекций, последовательностей) смотрятся органичнее всего. Да и foreach, далеко не панацея. Так же, как панацеей могут не оказаться mapcar, или все семейство vl- функций относящихся к обработке списков. То есть, решить задачу с помощью foreach, наверное, можно любую, но иногда куда как проще (а также понятней, и логичней), к примеру, взять и использовать цикл while, пролистывая в его теле список при помощи cdr, и одновременно совершая кучу других действий. Ну, или воспользоваться рекурсивным алгоритмом. |
|||
|
||||
Регистрация: 15.08.2005
г. Норильск
Сообщений: 451
|
Дык одно дело сам LISP, другое - его реализация на конкретной программно-аппаратной платформе.
Я однажды столкнулся. Правда - давно. И памяти в компах с тех пор изрядно добавилось и версия Автокада поменялась. Однако с тех пор - ну её нафиг, эту рекурсию... Как элемент непредсказуемости.
__________________
Счастливо, Алексей! |
|||
|
||||
конструктор Регистрация: 21.07.2007
Петрозаводск
Сообщений: 1,971
|
|
|||
|
||||
Регистрация: 18.05.2023
Сообщений: 6
|
Здравствуйте. Тема изъезженная, понимаю. Необходимо создать LISP для импорта координат точек в AutoCAD и последующего построения точек по ним (с точками совсем не скоро). Исходник координат в Excel, перевожу в txt с разделением табуляцией.
Пока дошел вот до этого с выводом координат в командную строку (для наглядности, чтобы я понимал что КАД вообще этот файл видит и читает): Код:
"1254.65\t654.26\t6589.21" "206646.26\t5486.15\t164.25" "15.2664\t201.16\t023.254" "154.10\t2168.489\t456.15" "18.20\t45632.15\t2031.22" "1648.25\t20.15\t254.16" Условных 6 точек просто пока для эксперимента. Теперь цель заставить автокад понять что от нуля до первой табуляции это Х, от первой табуляции это Y, и последнее соотвественно Z. Вроде как должно решаться strlen и ascii, но в справочниках пишут "функция возвращает длину строковой константы...", если кто может разжевать как это понять и что есть константа в моем примере? Предупреждая вопросы - осваиваю это дело по учебе, интересно, но нифига не понятно, поэтому использовать чужой "импорт XYZ" не могу. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787
|
Все что сейчас напишу - сугубо личное мнение.
Первое и самое главное - имена. Имена функций, переменных и т.д. Когда код даже на 10 строк, понять, что в переменной q хранится, может быть затруднительно. Далее. LISP - язык списков, и этим желательно пользоваться. Соответственно чтение файла можно сделать так: Код:
Код:
Код:
Код:
Код:
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. Последний раз редактировалось Кулик Алексей aka kpblc, 18.05.2023 в 15:34. |
|||
|
||||
Регистрация: 18.05.2023
Сообщений: 6
|
Цитата:
Выдает ошибку - слишком много аргументов. Остальные лиспы отключил, проблема не ушла. ----- добавлено через ~24 мин. ----- Цитата:
Код:
В командную строку выводит как вы и написали 3 значения в скобках, тут ок. Оно благодаря этому кусочку кода теперь понимает, что x=1254.65 y=654.26 z=6589.21? Подозреваю что нет. |
|||
|
||||
Цитата:
----- добавлено через ~15 мин. ----- Код:
координата X 1-й точки (car (nth 0 point_list)) координата Y 1-й точки (cadr (nth 0 point_list)) координата Z 1-й точки (caddr (nth 0 point_list)) и т.д.
__________________
K Lisp Последний раз редактировалось koMon, 18.05.2023 в 14:58. |
||||
|
||||
Регистрация: 17.01.2014
Сообщений: 97
|
Цитата:
Список - это основная структура данных в LISP, и если вы планируете начать изучать программирование вам потребуется понять как устроен список, как он формируется и как его обрабатывать. Чтобы передать программе сведения о том, что в списке у вас какие-то данные нужно обратиться к элементам списка. Это осуществляется через определенные функции, например: car, cadr, nth, last. Но в данном случае, у вас список координат, а это значит, что вы вообще можете не указывать какая цифра является той или иной координатой. Вы просто передаете этот список соответствующей функции, которая без ваших дополнительных подсказок понимает что первый элемент списка это x, второй y, а третий z. Например, функция создания точки: Код:
|
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787
|
Исправил опечатки. Offtop: Странно как-то код из VSCode копируется - то так, то этак.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
Опции темы | Поиск в этой теме |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
LISP. Вставка в таблицу поля, соотвествующего площади примитива | Profan | Готовые программы | 272 | 06.06.2021 23:12 |
Сейсмозащита и сейсмоизоляция существующих, построенных зд. | IANationalInformAgentstvo | Прочее. Архитектура и строительство | 216 | 20.01.2015 16:51 |
Мониторы LCD CRT | Разное | 94 | 17.06.2008 10:51 | |
ЮМОР 2006 =) | Perezz!! | Разное | 1122 | 04.01.2007 00:46 |