Можно ли выйти из цикла (foreach специальной командой lisp?
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Можно ли выйти из цикла (foreach специальной командой lisp?

Можно ли выйти из цикла (foreach специальной командой lisp?

Ответ
Поиск в этой теме
Непрочитано 10.12.2022, 12:13 #1
Можно ли выйти из цикла (foreach специальной командой lisp?
МишаИнженер
 
Регистрация: 14.12.2008
Сообщений: 1,134

В данной функции перебираются названия стилей мультивыносок и как только название найдено, надо выйти из цикла просмотра названий.
Как это можно сделать?
Данная функция при проверке говорит об ошибке: "; ошибка: завершить / выйти прервать"
Код:
[Выделить все]
 
(defun 	mLeaderstyleExist (styl / dict result)
	(setq i 0)
	(if (setq dict (dictsearch (namedobjdict) "ACAD_MLEADERSTYLE"))
		(foreach x dict
			(if (and (= (car x) 3) (eq (strcase (cdr x)) (strcase styl)))
				(progn (setq i (+ i 1)) (setq result (entget (cdr (nth i dict)))) (vl-exit-with-value))
				(setq i (+ i 1))
			)
		 ) ;_ конец if
	) ;_ конец foreach
)
Почему команда exit не подходит для этой задачи? Какую другую команду можно для этого использовать?

Последний раз редактировалось МишаИнженер, 10.12.2022 в 14:11.
Просмотров: 3276
 
Непрочитано 10.12.2022, 14:02
#2
Сергей812


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


т.е. книжка Полещука про AutoLisp уже забыта?) Вот реально, автор проделал большую работу по систематизации сведений о лиспе на русском языке - и все коту под хвост...
Сергей812 вне форума  
 
Автор темы   Непрочитано 10.12.2022, 14:15
#3
МишаИнженер


 
Регистрация: 14.12.2008
Сообщений: 1,134


Нашел в книге Полищука вот такую информацию: оказывается функция Exit в Lisp всегда при срабатывании выдает ошибку. Будто бы без ошибки из программы выйти нельзя?
Как тогда вообще надо выходить из циклов на Лиспе?
Даже новая функция vl-exit-with-value не помогает. Что вообще за тугопродуманый язык такой Лисп?
Похоже разработчки Лиспа подумали: "надо нам придумать функцию которая бы возвращала элемент списка по заданному названию".
Потом дальше подумали: "однако если мы в цикле найдем этот элемент у нас нет функции выхода из цикла. Да ну нафиг эти проблемы! Не будем придумывать такую функцию".
Так и остался Лисп без нормальных функций выходов из циклов и без функции нахождения элемента в списке по названию.
Ещё похоже Лисп придумали "недалекие простаки". Они думали примерно так: "не будем делать функции выхода из циклов. Чем больше будут работать циклы на нашем языке программирования тем дольше и шумнее будет звучать гул в наших ушах от работы компьютеров на нашем языке программирования! И тем больше будет слава везде про нашу изобретательность и мудрость!". А на самом деле люди мучаются из-за этих славолюбливых, ленивых и боязливых изобретателей.
Миниатюры
Нажмите на изображение для увеличения
Название: Функция Exit Lisp.png
Просмотров: 33
Размер:	111.0 Кб
ID:	251913  

Последний раз редактировалось МишаИнженер, 10.12.2022 в 16:49.
МишаИнженер вне форума  
 
Непрочитано 10.12.2022, 14:38
#4
Сергей812


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


например, ввести в условие цикла дополнительное условие.

Цитата:
Сообщение от МишаИнженер Посмотреть сообщение
тугопродуманый язык такой Лисп?
просто изначально альтернативы не было.. либо Lisp, либо ObjectARX. Потом сбоку прикрутили среду VBA от MS, сейчас уже давно .Net есть для "любительских" надстроек. Зависимость от версии - да ерунда, раньше вообще было четко по 3 версии акада на одном "ядре" подряд (такой труд, раз в три года перекомпилить приложение), потом началось некоторое "брожение" - но ничто не мешает иметь откомпилированные версии программы (в виде файлов *.dll, куда включено все - коды, диалоги) под разные акады (и не только) и запускать нужную.
Сергей812 вне форума  
 
Автор темы   Непрочитано 10.12.2022, 14:47
#5
МишаИнженер


 
Регистрация: 14.12.2008
Сообщений: 1,134


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
например, ввести в условие цикла дополнительное условие.
У меня есть такое условие:
Код:
[Выделить все]
 (if (and (= (car x) 3) (eq (strcase (cdr x)) (strcase styl)))
И как дальше выходить из этого условия?
Никто не знает? Даже разоаботчики Лиспа наверное не знают?
Я помню лет 10-15 назад изучал Лисп и этот "Exit" с ошибкой доводил меня до иступления и тогда я бросил изучать Лисп.
Похоже ситуация с тех пор не поменялась, или есть решение?
МишаИнженер вне форума  
 
Непрочитано 10.12.2022, 15:09
#6
Сергей812


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


вот как бы примерно выглядело на .Net (писал в блокноте)
Код:
[Выделить все]
 
 public bool IsExistMLeaderStyle(string aNameMLStyle)
 {
       // Получаем БД текущего чертежа    
       Database lDb = Application.DocumentManager.MdiActiveDocument.Database;
       // Флаг существования стиля	
       bool lIsExists = false;
        // Открытие транзакции 
	using(Transaction lTr = lDb.TransactionManager.StartTransaction())
	{
		// Получаем словарь существующих стилей ML
                DBDictionary lMLStyles = (DBDictionary)lTr.GetObject(lDb.MLeaderStyleDictionaryId, OpenMode.ForRead);
                // Собственно проверка существования стиля с сохранением в флаге
		lIsExists = lMLStyles.Contains(aNameMLStyle);
                // Подтверждение транзакции
		lTr.Commit();
	}
        // Возвращаем значение флага 
	return lIsExists;
 }
никаких циклов и сложновывернутого набора круглых скобок) А лисп мне тоже в свое время не зашел - хотя, наверно, больше из-за своих "урезанных" возможностей из коробки.

Последний раз редактировалось Сергей812, 10.12.2022 в 15:52. Причина: добавил коментарии в код
Сергей812 вне форума  
 
Автор темы   Непрочитано 10.12.2022, 15:34
#7
МишаИнженер


 
Регистрация: 14.12.2008
Сообщений: 1,134


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
DBDictionary lMLStyles = (DBDictionary)lTr.GetObject(lDb.MLeaderStyleDictionaryId, OpenMode.ForRead);
lIsExists = lMLStyles.Contains(aNameMLStyle);
lTr.Commit();
А где в этой строке "проверка условия" и команда "выхода" если условие выполняется?
МишаИнженер вне форума  
 
Непрочитано 10.12.2022, 15:52
#8
Сергей812


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


Цитата:
Сообщение от МишаИнженер Посмотреть сообщение
А где в этой строке "проверка условия" и команда "выхода" если условие выполняется?
добавил комментарии в код.
Сергей812 вне форума  
 
Автор темы   Непрочитано 10.12.2022, 15:58
#9
МишаИнженер


 
Регистрация: 14.12.2008
Сообщений: 1,134


// Собственно проверка существования стиля с сохранением в флаге
lIsExists = lMLStyles.Contains(aNameMLStyle); Если здесь все нашлось и записалось в флаг, тогда почему выполняется следующая строка? Почему здесь нет выхода из функции?
// Подтверждение транзакции
lTr.Commit(); Как программа попадает сюда, если в предыдущей строке все нашлось и записалось? Это что точка выхода?
Не понятно как можно без циклической проверки записей?
Мне это очень сложно. Мой уровень VBA, VB. А можно делать Net приложения для AutoCAD на Visual Basic?
МишаИнженер вне форума  
 
Непрочитано 10.12.2022, 16:03
#10
trir


 
Регистрация: 18.12.2010
Сообщений: 5,115


Цитата:
Почему здесь нет выхода из функции?
нужно закрыть транзакцию

Цитата:
Не понятно как можно без циклической проверки записей?
Linq

Цитата:
А можно делать Net приложения для AutoCAD на Visual Basic?
можно, но не нужно

Последний раз редактировалось trir, 10.12.2022 в 16:09.
trir вне форума  
 
Непрочитано 10.12.2022, 16:17
#11
Сергей812


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


Цитата:
Сообщение от МишаИнженер Посмотреть сообщение
А можно делать Net приложения для AutoCAD на Visual Basic?
можно на Vb.Net - чтобы синтаксиса не пугаться) В конечном итоге все преобразуется в один вид - MSIL.

Про выход уже выше написали - хотя в транзакции ничего не делали в плане изменения БД чертежа - но если не выполнить Commit, то автоматически будет вызван более ресурсоемкий метод Abort.

----- добавлено через ~11 мин. -----
только потом все равно на C# придется перейти - большинство годных примеров на нем всетаки)
Сергей812 вне форума  
 
Непрочитано 10.12.2022, 17:04
| 1 #12
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 627


О чем вообще спор?

(foreach ...) программист использует тогда, когда
понимает, что ему нужно обязательно перебрать
все элементы списка.

Нужно выйти из цикла по условию?

Тогда к вашим услугам функция (while ...)

(exit) порождает "ошибку" ?

Ну и что за беда - переопредели *error*, назначь
там вывод сообщений, возврат на место временно
изменённых системных переменных или просто
"тихий выход без сообщений" и радуйся жизни. :-)
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 10.12.2022, 17:34
#13
Сергей812


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


Цитата:
Сообщение от ===AAA=== Посмотреть сообщение
(foreach ...) программист использует тогда, когда
понимает, что ему нужно обязательно перебрать
все элементы списка.

Нужно выйти из цикла по условию?

Тогда к вашим услугам функция (while ...)

(exit) порождает "ошибку" ?

Ну и что за беда - переопредели *error*, назначь
там вывод сообщений, возврат на место временно
изменённых системных переменных или просто
"тихий выход без сообщений" и радуйся жизни. :-)
и как скучно в .Net - внутри тела любого из видов цикла (for, foreach, while или do) просто вызвал оператор break и вывалился из цикла)
Сергей812 вне форума  
 
Непрочитано 10.12.2022, 17:50
#14
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 627


Ага, я тоже в 80-е годы прошлого века на Фортране
программы фигачил - на 50 строк кода с десяток
операторов перехода. И ведь работало!

Но нас тогда учили, что они, операторы эти, есть
зло и самые правильные ЯП содержать их не должны.

:-)
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 10.12.2022, 18:03
#15
Сергей812


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


хотя если ТС будет "изучать" .Net таким же способом, как лисп - неизвестно, что лучше: лисп или .Net) В лиспе (как и в VBA) все-таки достаточно много вещей спрятано от разработчика - никаких транзакций, приведений типа и т.д. В .Net несколько раз в начале обучения умудрился "уронить" сам акад своим кодом
Сергей812 вне форума  
 
Непрочитано 10.12.2022, 18:30
#16
trir


 
Регистрация: 18.12.2010
Сообщений: 5,115


Цитата:
несколько раз в начале обучения умудрился "уронить" сам акад своим кодом
я его ронял его кодом
trir вне форума  
 
Непрочитано 10.12.2022, 18:32
#17
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от МишаИнженер Посмотреть сообщение
Нашел в книге Полищука вот такую информацию: оказывается функция Exit в Lisp всегда при срабатывании выдает ошибку. Будто бы без ошибки из программы выйти нельзя?
Как тогда вообще надо выходить из циклов на Лиспе?
Даже новая функция vl-exit-with-value не помогает. Что вообще за тугопродуманый язык такой Лисп?
Похоже разработчки Лиспа подумали: "надо нам придумать функцию которая бы возвращала элемент списка по заданному названию".
Потом дальше подумали: "однако если мы в цикле найдем этот элемент у нас нет функции выхода из цикла. Да ну нафиг эти проблемы! Не будем придумывать такую функцию".
Так и остался Лисп без нормальных функций выходов из циклов и без функции нахождения элемента в списке по названию.
Ещё похоже Лисп придумали "недалекие простаки". Они думали примерно так: "не будем делать функции выхода из циклов. Чем больше будут работать циклы на нашем языке программирования тем дольше и шумнее будет звучать гул в наших ушах от работы компьютеров на нашем языке программирования! И тем больше будет слава везде про нашу изобретательность и мудрость!". А на самом деле люди мучаются из-за этих славолюбливых, ленивых и боязливых изобретателей.
Ну да, ну да. Offtop: А если вообще даже не пытаться думать, то и любая CAD-система станет "непродуманной, медленной, кривой и глючной". И ваще, карандаш рулит!
Код:
[Выделить все]
 (defun mleaderstyleexists1 (stylename)
  (setq stylename (strcase stylename))
  (vl-remove-if-not
    (function
      (lambda (x)
        (and (= (car x) 3)
             (= (strcase (cdr x)) stylename)
        ) ;_ end of and
      ) ;_ end of LAMBDA
    ) ;_ end of function
    (dictsearch (namedobjdict) "acad_mleaderstyle")
  ) ;_ end of vl-remove-if-not
) ;_ end of defun

(defun mleaderstyleexists2 (stylename)
  (= (type
       (vl-catch-all-apply
         (function
           (lambda ()
             (vla-item (vla-item (vla-get-dictionaries (vla-get-activedocument (vlax-get-acad-object)))
                                 "acad_mleaderstyle"
                       ) ;_ end of vla-item
                       stylename
             ) ;_ end of vla-item
           ) ;_ end of LAMBDA
         ) ;_ end of function
       ) ;_ end of vl-catch-all-apply
     ) ;_ end of type
     'vla-object
  ) ;_ end of =
) ;_ end of defun
Ну и сравнение по скорости:
Код:
[Выделить все]
_$ (BENCHMARK '((MLEADERSTYLEEXISTS2 "asdf") (MLEADERSTYLEEXISTS1 "asdf")))
Benchmarking ..................Elapsed milliseconds / relative speed for 32768 iteration(s):

    (MLEADERSTYLEEXISTS1 "asdf").....1391 / 5.3 <fastest>
    (MLEADERSTYLEEXISTS2 "asdf").....7375 / 1 <slowest>
_$ (BENCHMARK '((MLEADERSTYLEEXISTS2 "asdf") (MLEADERSTYLEEXISTS1 "asdf")))
Benchmarking ..................Elapsed milliseconds / relative speed for 32768 iteration(s):

    (MLEADERSTYLEEXISTS1 "asdf").....1359 / 4.81 <fastest>
    (MLEADERSTYLEEXISTS2 "asdf").....6532 / 1 <slowest>
Код написан "на отцепись", просто как иллюстрация, что помимо 3-4 известных инструментов есть еще несколько встроенных функций. Которые тоже стоит использовать.
Миша, тебе давно пора в тему "Научите на примере", сколько можно?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 10.12.2022, 19:46
#18
SetQ

конструктор
 
Регистрация: 21.07.2007
Петрозаводск
Сообщений: 2,118


Цитата:
Сообщение от МишаИнженер Посмотреть сообщение
В данной функции перебираются названия стилей мультивыносок и как только название найдено, надо выйти из цикла просмотра названий.
Как это можно сделать?
Этого не надо делать, лисп - это функциональный язык, а не процедурный. Приложите пример dwg для тестирования, или попробуйте такое выражение:
Код:
[Выделить все]
 (defun mLeaderstyleExist (styl / dict result)
  (if (setq dict (dictsearch (namedobjdict) "ACAD_MLEADERSTYLE"))
    (vl-some
      '(lambda (x)
	 (if
	   (and (= (car x) 3) (eq (strcase (cdr x)) (strcase styl)))
	    (entget styl)
	 )
       )
      dict
    )
  )
)
SetQ вне форума  
 
Непрочитано 10.12.2022, 19:56
#19
Кулик Алексей aka kpblc
Moderator

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


Да, про vl-some я как-то не подумал
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 10.12.2022, 20:01
#20
SetQ

конструктор
 
Регистрация: 21.07.2007
Петрозаводск
Сообщений: 2,118


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Да, про vl-some я как-то не подумал
vl-some - это первое, что мне встретилось, когда я сейчас открыл сайт Lee Mac. Либо пишите на лиспе, как lee Mac, либо не мучайте ни себя, ни других, ни Вселенную.
SetQ вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Можно ли выйти из цикла (foreach специальной командой lisp?



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Lisp. Можно ли октрыть файл не открывая окна? Composter LISP 9 12.12.2016 22:38
LISP. Выравнивание текста по двум точкам. Krieger Готовые программы 10 24.12.2011 16:02
{Конкурс} Lisp. Задачки для студентов gomer LISP 10 05.01.2011 16:33
Как можно открыть чертеж через LISP на котором стоит пароль? ivspec LISP 7 10.02.2006 17:36
загрузка DOS прог через LISP Gaa LISP 15 12.08.2005 19:19