Можно ли выйти из цикла (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 вне форума  
 
Непрочитано 10.12.2022, 20:15
#21
Сергей812


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


Цитата:
Сообщение от SetQ Посмотреть сообщение
Либо пишите на лиспе, как lee Mac, либо не мучайте ни себя, ни других,
т.е. просто закрываем все темы программирования на лиспе?)

Проблема ТС - что он путает форум с индивидуальными занятиями, т.е. ожидает - что все будет построчно разъяснено применительно именно к его задачам.
Сергей812 вне форума  
 
Непрочитано 10.12.2022, 21:35
#22
trir


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


trir на форуме  
 
Непрочитано 11.12.2022, 01:05
#23
koMon


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


Код:
[Выделить все]
 
(defun mleaderstyleexists_3 (styl)
	(if (vl-catch-all-error-p (vl-catch-all-apply 'vla-item (list (vla-item (vla-get-dictionaries (vla-get-activedocument (vlax-get-acad-object))) "acad_mleaderstyle") styl)))
	  	nil t
	 )
)
__________________
K Lisp

Последний раз редактировалось koMon, 11.12.2022 в 01:18.
koMon вне форума  
 
Непрочитано 11.12.2022, 01:11
#24
Кулик Алексей aka kpblc
Moderator

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


Offtop: Ну блин... vl-catch-all-apply и все что рядом - достаточно затратные функции, как мне кажется. Понятно, что в некоторых случаях без них не обойтись. Но, кажется, случай ТС совсем не такой, и можно ограничиться работой только с текущим документом.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 11.12.2022, 01:18
#25
koMon


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


ну м.б. и затратные, хотя это надо проверять, но точно не как у Lee Mac-а

----- добавлено через ~4 мин. -----
не смотрел твой пост, не писал бы
__________________
K Lisp
koMon вне форума  
 
Непрочитано 11.12.2022, 19:51
#26
SetQ

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


Цитата:
Сообщение от koMon Посмотреть сообщение
но точно не как у Lee Mac-а
http://www.lee-mac.com/collectionfunctions.html
God bless Lee Mac.
SetQ вне форума  
 
Непрочитано 11.12.2022, 20:02
#27
Кулик Алексей aka kpblc
Moderator

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


Offtop: Че спорить?
Код:
[Выделить все]
 (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

(defun mleaderstyleexist_by_setq (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)
         ) ;_ end of if
       ) ;_ end of lambda
      dict
    ) ;_ end of vl-some
  ) ;_ end of if
) ;_ end of defun


(defun mleaderstyleexists_3 (styl)
  (if (vl-catch-all-error-p
        (vl-catch-all-apply
          'vla-item
          (list (vla-item (vla-get-dictionaries (vla-get-activedocument (vlax-get-acad-object)))
                          "acad_mleaderstyle"
                ) ;_ end of vla-item
                styl
          ) ;_ end of list
        ) ;_ end of vl-catch-all-apply
      ) ;_ end of vl-catch-all-error-p
    nil
    t
  ) ;_ end of if
) ;_ end of defun
И после этого:
Код:
[Выделить все]
 _$ (BENCHMARK '((MLEADERSTYLEEXISTS1 name) (MLEADERSTYLEEXISTS2 name) (MLEADERSTYLEEXIST_BY_SETQ name) (MLEADERSTYLEEXISTS_3 name)))
Benchmarking ..................Elapsed milliseconds / relative speed for 32768 iteration(s):

    (MLEADERSTYLEEXISTS1 NAME)...........1266 / 5.96 <fastest>
    (MLEADERSTYLEEXIST_BY_SETQ NAME).....2640 / 2.86
    (MLEADERSTYLEEXISTS2 NAME)...........7390 / 1.02
    (MLEADERSTYLEEXISTS_3 NAME)..........7547 / 1 <slowest>
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 11.12.2022, 21:10
#28
koMon


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


о, банкет продолжается)))

Цитата:
Сообщение от SetQ Посмотреть сообщение
God bless Lee Mac
что-то это мне очень напоминает

Алексей, ещё для теста тогда уж нумер 4

Код:
[Выделить все]
 (defun mleaderstyleexists_4 (ml_style_name_string)
  (if (vl-member-if '(lambda (list_element) (= (if (= 3 (car list_element)) (strcase (cdr list_element))) (strcase ml_style_name_string)))
		     (dictsearch (namedobjdict) "ACAD_MLEADERSTYLE")
      )
      	t nil
  )
)
в реальной жизни конечно же едва ли 30к итераций можно себе представить имхо, это будет скорее однократное выполнение, поэтому этот синтетический тест хрень полная)
__________________
K Lisp
koMon вне форума  
 
Непрочитано 11.12.2022, 21:17
#29
Кулик Алексей aka kpblc
Moderator

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


Ну йопырысыты, у меня в библиотеке болтается бенчмарк, сами-то сделайте Кстати, а на фига if? Альтернатива:
Код:
[Выделить все]
   (or (vl-member-if
        (function (lambda (list_element)
                    (= (if (= 3 (car list_element))
                         (strcase (cdr list_element))
                       ) ;_ end of if
                       (strcase ml_style_name_string)
                    ) ;_ end of =
                  ) ;_ end of lambda
        ) ;_ end of function
        (dictsearch (namedobjdict) "ACAD_MLEADERSTYLE")
      ) ;_ end of vl-member-if
  ) ;_ end of or
----- добавлено через 11 сек. -----
Ну так, чисто поржать
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.

Последний раз редактировалось Кулик Алексей aka kpblc, 11.12.2022 в 21:21. Причина: Поменял чутка;)
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 11.12.2022, 21:20
#30
koMon


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


эх, не будет теста(
__________________
K Lisp
koMon вне форума  
 
Непрочитано 11.12.2022, 21:22
#31
Кулик Алексей aka kpblc
Moderator

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


А че так? )))
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 11.12.2022, 21:23
#32
koMon


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


ну ты же отказал)
__________________
K Lisp
koMon вне форума  
 
Непрочитано 11.12.2022, 21:26
#33
Кулик Алексей aka kpblc
Moderator

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


Ладно, попрбую провернуть
Код:
[Выделить все]
 (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

(defun mleaderstyleexist_by_setq (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)
         ) ;_ end of if
       ) ;_ end of lambda
      dict
    ) ;_ end of vl-some
  ) ;_ end of if
) ;_ end of defun

(defun mleaderstyleexists_3 (styl)
  (if (vl-catch-all-error-p
        (vl-catch-all-apply
          'vla-item
          (list (vla-item (vla-get-dictionaries (vla-get-activedocument (vlax-get-acad-object)))
                          "acad_mleaderstyle"
                ) ;_ end of vla-item
                styl
          ) ;_ end of list
        ) ;_ end of vl-catch-all-apply
      ) ;_ end of vl-catch-all-error-p
    nil
    t
  ) ;_ end of if
) ;_ end of defun

(defun mleaderstyleexists_4 (ml_style_name_string)
  (if (vl-member-if
        '(lambda (list_element)
           (= (if (= 3 (car list_element))
                (strcase (cdr list_element))
              ) ;_ end of if
              (strcase ml_style_name_string)
           ) ;_ end of =
         ) ;_ end of lambda
        (dictsearch (namedobjdict) "ACAD_MLEADERSTYLE")
      ) ;_ end of vl-member-if
    t
    nil
  ) ;_ end of if
) ;_ end of defun

(defun mleaderstyleexists_4.1 (ml_style_name_string)
  (or (vl-member-if
        '(lambda (list_element)
           (= (if (= 3 (car list_element))
                (strcase (cdr list_element))
              ) ;_ end of if
              (strcase ml_style_name_string)
           ) ;_ end of =
         ) ;_ end of lambda
        (dictsearch (namedobjdict) "ACAD_MLEADERSTYLE")
      ) ;_ end of vl-member-if
  ) ;_ end of or
) ;_ end of defun
Код:
[Выделить все]
 (benchmark '((mleaderstyleexists1 name)
             (mleaderstyleexists2 name)
             (mleaderstyleexist_by_setq name)
             (mleaderstyleexists_3 name)
             (mleaderstyleexists_4 name)
             (mleaderstyleexists_4.1 name)
            )
) ;_ end of BENCHMARK
Код:
[Выделить все]
_$ 
Benchmarking ..................Elapsed milliseconds / relative speed for 32768 iteration(s):

    (MLEADERSTYLEEXISTS1 NAME)...........1297 / 5.55 <fastest>
    (MLEADERSTYLEEXIST_BY_SETQ NAME).....2594 / 2.78
    (MLEADERSTYLEEXISTS_4 NAME)..........2703 / 2.66
    (MLEADERSTYLEEXISTS_4 NAME)..........2719 / 2.65
    (MLEADERSTYLEEXISTS_3 NAME)..........6937 / 1.04
    (MLEADERSTYLEEXISTS2 NAME)...........7203 / 1 <slowest>
----- добавлено через 25 сек. -----
Цитата:
Сообщение от koMon Посмотреть сообщение
ну ты же отказал)
Чего???

----- добавлено через ~2 мин. -----
И что-то у меня есть подозрения, что в компилированном лиспе ситуация может поменяться
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 11.12.2022, 21:31
#34
koMon


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
И что-то у меня есть подозрения, что в компилированном лиспе ситуация может поменяться
ну, какбэ, ждём-с)))

----- добавлено через ~7 мин. -----
ещё у тебя в #1 возвращается список, в то время как в 3, 4 делается ещё один if. мелочь, но 30к должно накатить будь здоров)
__________________
K Lisp
koMon вне форума  
 
Непрочитано 11.12.2022, 22:09
#35
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от koMon Посмотреть сообщение
ну, какбэ, ждём-с)))
Не, тут я мимо. Если кто захочет - вперед. но сейчас меня на это не хватит ))
Цитата:
Сообщение от koMon Посмотреть сообщение
ещё у тебя в #1 возвращается список, в то время как в 3, 4 делается ещё один if. мелочь, но 30к должно накатить будь здоров)
А вот это уже неважно ИМХО - либо nil, либо какая-то фигня. Которая не nil
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум 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