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

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

Забавные случаи с LISPовски кодом

Ответ
Поиск в этой теме
Непрочитано 21.05.2015, 17:16 #1
Забавные случаи с LISPовски кодом
P_S
 
Санкт-Петербург
Регистрация: 09.10.2006
Сообщений: 99

1. Непонятка
Писал я как-то программку для создания чертежа из какого-то обменного формата - текстовый файл с кодами и разделителями.
Ну вот, полилиния. Считываем в цикле строку за строкой и лепим набор списков с кодом 10 для entmake:
Код:
[Выделить все]
 ...
(setq str2(vl-string-trim "COORD:" str2)
      coo_lst(append coo_lst(list(list 10(atof(vl-string-trim ","(vl-string-trim(substr str2 1
	           (vl-string-position(ascii ",") str2))str2)))(atof(substr str2 1(vl-string-position(ascii ",") str2)))))))
Загрузил - кракозябры. Из сотни - другой правильно посаженных вершин одна - сбойная. Искал какие-то закономерности сбоя - не нашел.
Плюнул, заменил разбор строки разбором списка:
Код:
[Выделить все]
 (defun str_coo(lst)
  (if lst
    (if(not(=(car lst)(ascii ",")))
      (cons(car lst)(str_coo(cdr lst))))))
...
(setq str2(vl-string-trim "COORD:" str2)		
      str2(vl-string->list str2)
      coo_lst(append coo_lst(list(list 10(atof(vl-list->string(str_coo(cdr(member(ascii ",") str2)))))
				      (atof(vl-list->string(str_coo str2)))))))
и всё заработало. Что это было, так и не понял.

2. LISP против геометрии
Ещё была задачка - надо работать с точками пересечения полилинии и набора односегментных полилиний. По условиям построения, полилиния без петель,
так что для каждого объекта из набора точка пересечения только одна. Так что пишу в цикле:
Код:
[Выделить все]
 (setq 
       int_pt(vla-IntersectWith pl_add (vlax-ename->vla-object(ssname int_ln i)) acExtendOtherEntity))
и продолжаю дальше что-то делать с этим значением. Сбой. Посмотрел - глазам не поверил. Возвращаемое значение - массив
с двумя точками (с одинаковыми координатами). Потом дошло: когда точка пересечения точно совпадает с вершиной полилинии,
координаты эти являются решением для двух уравнений, описывающих два сегмента полилинии. Вот и возвращает функция две точки
пересечения, хотя, как ни вглядывайся, она одна. Вот и пришлось добавить строку с car и cadr.
Просмотров: 3928
 
Непрочитано 21.05.2015, 18:44
#2
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Слишком много букаф скобок... Ниасилил.
Profan вне форума  
 
Непрочитано 21.05.2015, 22:28
#3
Дима_

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


А "сбойные" вершины отдельно прогнать??
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 21.05.2015, 22:34
#4
Кулик Алексей aka kpblc
Moderator

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


P_S, во-первых, где исходник (хотя бы текстовый)? Во-вторых, помимо IntersectWith есть и простой inters - для прямых участков. В-третьих, а ты уверен, что надо удлинять именно второй объект, а не первый? Или оба?

----- добавлено через ~1 мин. -----
На фига конструкция (member(ascii ",") <...>)
Когда можно просто сделать vl-string-subst?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 21.05.2015, 22:38
#5
gomer

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


с такими шарфами я вообще удивляюсь что что-то работает
gomer вне форума  
 
Непрочитано 21.05.2015, 22:41
#6
Кулик Алексей aka kpblc
Moderator

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


Offtop: gomer, ты еще мои спагетти не видел
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 22.05.2015, 10:03
#7
nolte

спринклеры, сантехника
 
Регистрация: 26.01.2010
Сообщений: 190
Отправить сообщение для nolte с помощью Skype™


Offtop:
P_S, ты попал
__________________
Знание лисп: со справочником Н. Полещука
nolte вне форума  
 
Автор темы   Непрочитано 22.05.2015, 10:26
#8
P_S


 
Регистрация: 09.10.2006
Санкт-Петербург
Сообщений: 99


Кулик Алексей aka kpblc,
По п.1. Строки были такого формата:

COORD:1041.83,4991.66,6.787
COORD:1040.17,5005.65
COORD:1043.96,5003.63

Вопрос: чем последняя строка отличается от двух предыдущих, которые обрабатываются корректно?
Код:
[Выделить все]
 (vl-string-position(ascii ",") str2)
потому что задача состояла в том, чтобы из строки с неизвестным количеством знаков и разделителей сделать список типа
(10 знач2 знач1)

По п.2. Под конкретный чертёж делалось, который я своими глазами видел, и результат - не верь глазам своим.
P_S вне форума  
 
Непрочитано 22.05.2015, 11:39
#9
Кулик Алексей aka kpblc
Moderator

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


Нормальный код нормально срабатывает. Поскольку свой ты показываешь кусками, где там у тебя ошибка - остается только гадать. Я подозреваю, что ты конечный список не проверяешь, и у тебя три координаты первого элемента неправильно парсятся.
Гоняй, изучай, тестируй. Писалось "на коленке" и разъяснять код я не буду - некогда
Вложения
Тип файла: lsp test.LSP (3.5 Кб, 22 просмотров)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 22.05.2015, 14:51
#10
P_S


 
Регистрация: 09.10.2006
Санкт-Петербург
Сообщений: 99


Кулик Алексей aka kpblc,
Наверное, надо было с этого начать. Основной смысл рассказанных мной анекдотов в том, что при выполнении LISPовского кода
происходят процессы, которые мы не видим и не контролируем, приводящие иногда к неожиданным результатам. Я и привожу только те
строки, где это происходит. Остальное, я думаю, не интересно.
Надеюсь, что в случае с пересечениями я правильно понял, каким образом решение системы уравнений координатной
геометрии, скрытое от наших глаз, даёт две точки пересечения, вместо ожидаемой одной. А вот почему именно приведённая мною
комбинация команд обработки строк одну из сотни однотипных строк обрабатывает иначе, чем остальные, пожалуй, никогда не узнаю.
Вот, кстати, как обрабатывается выложенный кусочек файла выложенным кусочком кода (во всяком случае, на моей машине и в моей
версии Автокада)
((10 4991.66 1041.83))
((10 5005.65 1040.17))
((10 5.0 1043.96))
P_S вне форума  
 
Непрочитано 22.05.2015, 14:55
#11
Кулик Алексей aka kpblc
Moderator

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


P_S, тебе никто не мешает нормально использовать vlide. Для начала можно глянуть http://autolisp.ru/2009/09/10/vlide-misc-01/ ; http://autolisp.ru/2009/09/12/vlide-misc-02/
Цитата:
Сообщение от P_S Посмотреть сообщение
Вот, кстати, как обрабатывается выложенный кусочек файла выложенным кусочком кода (во всяком случае, на моей машине и в моей
версии Автокада)
Это означает что код написан неверно.
Цитата:
Сообщение от P_S Посмотреть сообщение
в случае с пересечениями я правильно понял, каким образом решение системы уравнений координатной
геометрии, скрытое от наших глаз, даёт две точки пересечения, вместо ожидаемой одной
Образец исходного dwg и полный код - где? В хрустальном шаре смотреть? У ноосферы спрашивать?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 22.05.2015, 21:28
#12
Дима_

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


Цитата:
Сообщение от P_S Посмотреть сообщение
сновной смысл рассказанных мной анекдотов в том, что при выполнении LISPовского кода
происходят процессы, которые мы не видим и не контролируем, приводящие иногда к неожиданным результатам.
Мне кажется проблема не в лиспе...
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 23.05.2015, 11:08
1 | #13
Vov.Ka


 
Регистрация: 21.07.2008
Луцьк
Сообщений: 179


Цитата:
Сообщение от P_S Посмотреть сообщение
Вопрос: чем последняя строка отличается от двух предыдущих, которые обрабатываются корректно?
прочитай в хелпе, что делает функция vl-string-trim и тебе все станет понятно

лучше вот так сделай и не парся
Код:
[Выделить все]
 (cons 10 (reverse (read (strcat "(" (vl-string-translate "," " " (substr str2 7)) ")"))))

Последний раз редактировалось Vov.Ka, 23.05.2015 в 11:14.
Vov.Ka вне форума  
 
Непрочитано 23.05.2015, 12:20
#14
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Я так понял речь идет о забавных багах лиспа?
Заметил такой баг.
Если перефразировать одну забавную фразу одного известного боксера, то получится примерно такой анекдот:

Если значения координат запредельно большие 10^n, то команды в функции command работают неправильно. Вернее работают не только лишь все, не каждый знает когда эта команда сработает не правильно.
mmax вне форума  
 
Непрочитано 23.05.2015, 13:41
#15
gomer

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


Цитата:
Сообщение от mmax Посмотреть сообщение
функции command работают неправильно
command - это отдельная пестня... написал тут одну команду, но из-за лени открывать влид не стал и кнопку не делал, прописал в лиспе запуск команды при загрузке... НО в автокаде (command "mycmd" ... не работает вообще, в брикскаде работает, но системные переменные почему то не изменяются, хотя это и прописано в команде пришлось лишний раз кнопкодавить при загрузке...
gomer вне форума  
 
Непрочитано 24.05.2015, 02:18
#16
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,680


Offtop: gomer, а если вместо (command "mycmd"... написать (C:mycmd)? Не пойдёт? Однако если в той команде интерактивные запросы предусмотрены, то мимо. Тогда vla-sendcommand, может, прокатит?
skkkk вне форума  
 
Непрочитано 24.05.2015, 06:50
#17
ShaggyDoc

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


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Мне кажется проблема не в лиспе...
Да. "Забавные случаи" связаны с забавно написанным кодом, а не с самим Lisp. Кто-то спотыкается "ошибке 1", кто-то на "ошибке 2", кто-то на вещественных числах, кто-то придумает свою "уловку 22".

Кое-что добавляет Autodesk, "улучшая" AutoCAD. Но в любом случае ошибки надо искать в своем коде, а не в языке.

То же самое наблюдается и в других языках программирования.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 01.06.2015, 20:07
#18
P_S


 
Регистрация: 09.10.2006
Санкт-Петербург
Сообщений: 99


Кулик Алексей aka kpblc,
Цитата:
Это означает что код написан неверно.
НЕ соглашусь, я бы сказал, что по какой-то причине часть аргументов, передаваемых этому коду, оказывается вне области, корректно этим кодом обрабатываемой.
Попробую пояснить на примере: при работе любой рекурсивной функции при достаточно большом количестве циклов произойдёт переполнение стека, т.е. можно передать функции аргумент, который она обработать не сможет. Что-то в этом духе и здесь. В общем, есть вещи не совсем очевидные и совсем не очевидные.
Кстати, насчёт двойной точки пересечения:
Цитата:
Образец исходного dwg и полный код - где?
чертёж, на котором отлаживался код, естественно, безвозвратно канул, а на других мне этот эффект воспроизвести не удалось. Но ведь было же, непонятно только, что и как для этого должно было сложиться.
P_S вне форума  
 
Непрочитано 04.06.2015, 01:49
#19
kakt00z

инженер-проектировщик КИПиА
 
Регистрация: 30.08.2008
Минск
Сообщений: 159


долго перечитывал, за это время загнал себя в идиоты и обратно, в итоге решил:
#5 нужно поместить вместо заголовка!
и вот очень нужной в данном случае функции expt - очень зря не использовали - ускорение работы проги было бы в разы

PS да и забавностей поддабавилось бы
kakt00z вне форума  
 
Непрочитано 04.06.2015, 09:54
1 | #20
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от P_S Посмотреть сообщение
Что-то в этом духе и здесь.
У тебя настолько дикое количество вычислений? Не поверю - это раз. Второе: ты свой код целиком так и не показал. Третье: нестабильность работы программы, как правило, означает не полную проработку кода.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Забавные случаи с LISPовски кодом