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

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

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

Ответ
Поиск в этой теме
Непрочитано 10.12.2022, 12:13
Можно ли выйти из цикла (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, 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