Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу) - Страница 24
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)

Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)

Ответ
Поиск в этой теме
Непрочитано 20.07.2008, 20:12 1 |
Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)
Red Nova
 
ՃԱՐՏԱՐԱԳԵՏ, տ.գ.թ.
 
Торонто
Регистрация: 23.10.2007
Сообщений: 1,990

Со школы не ладится у меня с программированием. Все предметы щелкал, а на экзамене по информатике (Visual foxpro) программку типа суммирования столбцов списал у соседа (это уже в университете).
Не смотря на эте намерен научится писать программы для Автокада на лиспе, скачал книгу Хювенена, несколько примеров создания программ, но после получасового “смотрения” таких книг мое мышление явно притормаживает.
Решил пойти другим путем.
Нашел самый короткий лисп из моей коллекции, и прошу программистов с этого форума пошагово объяснить какой символ что означает. Надеюсь на вашу помощь.


Код:
[Выделить все]
(defun c:make-blocks-explodeable (/ adoc)
  (vl-load-com)
  (vla-startundomark
    (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of vla-startundomark
  (vlax-for blk_def (vla-get-blocks adoc)
    (if (and (equal (vla-get-isxref blk_def) :vlax-false)
             (equal (vla-get-islayout blk_def) :vlax-false)
             ) ;_ end of and
      (vl-catch-all-apply '(lambda () (vla-put-explodable blk_def :vlax-true)))
      ) ;_ end of if
    ) ;_ end of vlax-for
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
_____________________________________________________________________________________________________________

Прошло много лет и топик теперь представляет из себя площадку для обучения азов программирования для многих начинающих.
Так что начинающие лиспогрызы приветствуются .
__________________
Блог

Последний раз редактировалось Red Nova, 12.07.2017 в 05:43.
Просмотров: 2049084
 
Непрочитано 29.09.2008, 13:09
#461
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


вроде, так проще и быстрее...
Код:
[Выделить все]
(defun test (var lst)
 (vl-some (function (lambda (a) (= var a))) lst)
)
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 29.09.2008, 14:33
#462
Red Nova

ՃԱՐՏԱՐԱԳԵՏ, տ.գ.թ.
 
Регистрация: 23.10.2007
Торонто
Сообщений: 1,990
Отправить сообщение для Red Nova с помощью Skype™


CB,
Цитата:
1. Что есть такое - "\U+E72E" "\U+E720" "\U+E729" "\U+E725" (у меня все они отображаются как знак квадрата). Хотя наверняка это символы уголка, двутавра и т.д. из СПДС?
Все как ты и предположил. Прикрепляю этот шрифт.
Цитата:
2. Почему список ограничен номером 20 - "20%%c", "20 %%c", "20\U+E712", "20 \U+E712"? Что "25%%c" или "120%%c"не может быть?
\U+E712 и 20%%c означают диаметр, это используется, когда на сечении балки или колонны ставят на одну позицию выноску, и заодно пишут сколько там такой арматуры. На пример 8 \U+E712 12 AIII, означает, что там 8 арматур диаметром 12. Ввиду того, что балки и колонны не армируются очень большим количеством стержней я ввел ограничение.
Дима_,
Цитата:
P.S. Red Nova - прости что глумимся в твоей ветке.
Глумитесь на здоровье.
Вложения
Тип файла: rar CS GOST 2304.rar (22.6 Кб, 136 просмотров)
__________________
Блог
Red Nova вне форума  
 
Непрочитано 29.09.2008, 14:47
#463
Дима_

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


То VVA чем меньше список тем быстрее "простой перебор", его можно оптимизировать экономя байты - но эта оптимизация в пределах нескольких процентов, а check3_1 - это совсем другой алгоритм, он не быстро "все подряд" перебирает, а интелектуально! А если spisok до тысячи дорастет? Как тогда Benchmarking'и будут выглядеть, а до 10 тыс.?
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 29.09.2008, 15:12
#464
Red Nova

ՃԱՐՏԱՐԱԳԵՏ, տ.գ.թ.
 
Регистрация: 23.10.2007
Торонто
Сообщений: 1,990
Отправить сообщение для Red Nova с помощью Skype™


Товарищи программисты. Когда выдастся свободная от дискуссий минутка не могли бы ли вы добавить в наш код условия с #445? У меня все равно умений не хватит самому сотворить.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 29.09.2008, 16:50
#465
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


По условиям #445 A, B.1, B.2 Изменения выделены красным
Код:
[Выделить все]
(vl-load-com)
(defun parsing (tmp)
(and
(= (length tmp) 2); длина списка равна 2
(/= (car tmp) ""); Первый элемент не равен ""
(/= (cadr tmp) ""); то же со вторым
(check2 (car tmp)); проверка второго условия к первой строке
(check3 (cadr tmp) spisok); проверка первых символов второй строки
);блок условий который надо расширять до твоих требований
);end of parsing
 
(defun filtr (lst / newlst)
(foreach tmp lst
(if (parsing tmp)
  (setq newlst
         (append newlst
           (list
             (mapcar 'prep-str tmp)))
    )
  )
);end of foreach
(while-remove-lst newlst)
);end filtr

ПОЛНЫЙ ТЕКСТ ВО ВЛОЖЕНИИ 445.lsp
Обращаю внимение, что в списке lisp'a символы юникода должны писаться с двойным слэшем
(setq spisok (list "\\U+E72E" )

*** Добавлено
Автоматически приклеились ссылки, прикрепляю файл. Проверка-функция test2
Вложения
Тип файла: lsp 445.LSP (7.4 Кб, 129 просмотров)
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 29.09.2008 в 22:33.
VVA вне форума  
 
Автор темы   Непрочитано 29.09.2008, 18:13
#466
Red Nova

ՃԱՐՏԱՐԱԳԵՏ, տ.գ.թ.
 
Регистрация: 23.10.2007
Торонто
Сообщений: 1,990
Отправить сообщение для Red Nova с помощью Skype™


VVA, Спасибо, но пока не все гладко.
При загрузке пишет
Код:
[Выделить все]
Command: _appload test.lsp successfully loaded.

Command: ; error: extra right paren on input
Пробовал фильтровать такой список выносок.
Код:
[Выделить все]
(("1" "-10х100x100") ("1" "-10х100x100") ("2" "Швеллер 12") 
("2" "Швеллер 12, L=1000") ("2" "Швеллер 12, L=1000, шаг 1000") 
("3" "12 Ас1, ΣL=10000")  ("3" "12 Ас1") ("4" "20 Ас1") ("5" "20 А500c")
 ("5" "20 А500c, L=1000"))
Вернуло вот что
Код:
[Выделить все]
(("1" "-10х100x100") ("2" "Швеллер 12") ("2" "Швеллер 12, L=1000") 
("5" "20 А500c") ("5" "20 А500c, L=1000"))
Если заметил, полностью пропали позиции 3 и 4. А позиции 2 и 5 не отфильтровались полностью
__________________
Блог

Последний раз редактировалось Red Nova, 29.09.2008 в 21:32.
Red Nova вне форума  
 
Автор темы   Непрочитано 29.09.2008, 19:25
#467
Red Nova

ՃԱՐՏԱՐԱԳԵՏ, տ.գ.թ.
 
Регистрация: 23.10.2007
Торонто
Сообщений: 1,990
Отправить сообщение для Red Nova с помощью Skype™


VVA,
Цитата:
Обращаю внимение, что в списке lisp'a символы юникода должны писаться с двойным слэшем
(setq spisok (list "\\U+E72E" )
А у меня и с одним слешом предыдущяя версия с #445 работала корректно.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 29.09.2008, 22:27
#468
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Red Nova, В #465 я писал
Цитата:
*** Добавлено
Автоматически приклеились ссылки, прикрепляю файл. Проверка-функция test2
Грузить надо его
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 29.09.2008 в 22:34.
VVA вне форума  
 
Автор темы   Непрочитано 29.09.2008, 22:46
#469
Red Nova

ՃԱՐՏԱՐԱԳԵՏ, տ.գ.թ.
 
Регистрация: 23.10.2007
Торонто
Сообщений: 1,990
Отправить сообщение для Red Nova с помощью Skype™


Только дошел смысл этих строк.
Пробовал (test)
Вот результат работы этого лиспа для списка с #466
Код:
[Выделить все]
(("1" "-10х100x200") ("2" "Швеллер 12, L=1000") ("2" "Швеллер 12") ("3" "12 
Ас1, ΣL=10000") ("3" "12 Ас1") ("4" "20 Ас1") ("5" "20 А500c, L=1000") ("5" 
"20 А500c"))
Позиции 2 и 5 не отфильтровались до конца, от каждого надо оставить более длинный список, если длина равна, то брать можно любой (даже если содержания разные)
(test2) выдает
Код:
[Выделить все]
(("1" "-10х100x200") ("2" "Швеллер 12, L=1000") ("2" "Швеллер 12") ("3" "∅12 
Ас1, ?L=10000"))
Ты не ответил на #467.
У тебя в коде есть также символы с тремя слешами, типа
Код:
Это опечатка?
__________________
Блог
Red Nova вне форума  
 
Непрочитано 29.09.2008, 22:59
#470
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Цитата:
Это опечатка?
Да
Цитата:
А у меня и с одним слешом предыдущяя версия с #445 работала корректно
А у меня выдавала в списке так "U+E729"
Цитата:
Позиции 2 и 5 не отфильтровались до конца
Из пункта A #445 я сделал только
Цитата:
Необходимо удалить дублирующие элементы
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 29.09.2008, 23:19
#471
Vov.Ka


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


предлагаю свой вариант для BenchMarkа
Код:
[Выделить все]
(defun check_vk_v1 (var lst /)
  (setq var (strcat var "*"))
  (and (vl-member-if
	 (function (lambda (e) (wcmatch e var)))
	 lst
       )
  )
)
Vov.Ka вне форума  
 
Непрочитано 29.09.2008, 23:38
#472
Кулик Алексей aka kpblc
Moderator

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


К вопросу о фильтрации других СПДС-объектов (точнее, выносок)
Голова что-то соображает достаточно хреново, поэтому только такой код смог "родить":
Код:
[Выделить все]
(defun _dwgru-get-spds-text-and-range (/ selset lst)
                                      ;|
*    Возвращает список строк выделенных выносок. В набор попадают узловые выноски,
* позиционные выноски, цепные и гребенчатые.
*    Параметры вызова:
	нет
*    Примеры вызова:
(_dwgru-get-spds-text)
	;
|;
  (if
    (and
      (= (type (setq selset (vl-catch-all-apply
                              (function (lambda () (ssget)))
                              ) ;_ end of vl-catch-all-apply
                     ) ;_ end of setq
               ) ;_ end of type
         'pickset
         ) ;_ end of =
      (setq selset
             (vl-remove-if-not
               (function
                 (lambda (x)
                   (member (cdr (assoc 0 x))
                           '("spdsNotePosition"
                             "spdsNoteKnot"
                             "spdsNoteComb"
                             "spdsNoteChain"
                             )
                           ) ;_ end of member
                   ) ;_ end of lambda
                 ) ;_ end of function
               (mapcar
                 (function (lambda (a)
                             (vl-remove-if-not
                               '(lambda (b) (member (car b) '(0 300 301 90)))
                               (entget a)
                               ) ;_ end of vl-remove-if-not
                             ) ;_ end of lambda
                           ) ;_ end of function
                 (_dwgru-conv-pickset-to-list selset)
                 ) ;_ end of mapcar
               ) ;_ end of vl-remove-if-not
            ) ;_ end of setq
      ) ;_ end of and
     (setq
       lst
        (mapcar
          (function
            (lambda (item)
              (cond
                ((= (cdr (assoc 0 item)) "spdsNoteKnot")
                 (append (mapcar
                           (function cdr)
                           (vl-remove-if-not
                             (function
                               (lambda (x)
                                 (= (car x) 300)
                                 ) ;_ end of lambda
                               ) ;_ end of function
                             (reverse
                               (member '(301 . "Выравнивание текста")
                                       (reverse (member '(301 . "Номер узла") item))
                                       ) ;_ end of member
                               ) ;_ end of reverse
                             ) ;_ end of vl-remove-if-not
                           ) ;_ end of mapcar
                         (list 1)
                         ) ;_ end of append
                 )
                ((= (cdr (assoc 0 item)) "spdsNotePosition")
                 (append (mapcar
                           (function cdr)
                           (vl-remove-if-not
                             (function
                               (lambda (x)
                                 (= (car x) 300)
                                 ) ;_ end of lambda
                               ) ;_ end of function
                             (member '(301 . "Первая строка") item)
                             ) ;_ end of vl-remove-if-not
                           ) ;_ end of mapcar
                         (list 1)
                         ) ;_ end of append
                 )
                ((member (cdr (assoc 0 item))
                         '("spdsNoteComb" "spdsNoteChain")
                         ) ;_ end of member
                 (append
                   (mapcar
                     (function cdr)
                     (vl-remove-if-not
                       (function
                         (lambda (x)
                           (= (car x) 300)
                           ) ;_ end of lambda
                         ) ;_ end of function
                       (reverse
                         (member '(301 . "Выравнивание текста")
                                 (reverse (member '(301 . "Первая строка") item))
                                 ) ;_ end of member
                         ) ;_ end of reverse
                       ) ;_ end of vl-remove-if-not
                     ) ;_ end of mapcar
                   (list (cdr (assoc 90 (reverse item))))
                   ) ;_ end of cons
                 )
                ) ;_ end of cond
              ) ;_ end of lambda
            ) ;_ end of function
          selset
          ) ;_ end of mapcar
       ) ;_ end of setq
     ) ;_ end of if
  lst
  ) ;_ end of defun
Хотя на самом деле там можно просто собирать (cdr(assoc 300 (member '(301 . "Info") (entget <Элемент набора, преобразованного в список>)))) - там же полная (практически) информация о выноске! Одной строкой! Преобразовать ее в список не так уж и сложно...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 30.09.2008, 00:03
#473
Red Nova

ՃԱՐՏԱՐԱԳԵՏ, տ.գ.թ.
 
Регистрация: 23.10.2007
Торонто
Сообщений: 1,990
Отправить сообщение для Red Nova с помощью Skype™


Кулик Алексей aka kpblc, Спасибо большое. Наконец и другие выноски можно добавить к списку. (к стати в коде указан неверный пример вызова команды)
Вот пример полученного таким путем списка.
Цитата:
(("Узел" "" "1" 1) ("Цепная" "Выноска" 2) ("Греб" "Выноска" 2) ("Поз" "Выноска" 1))
Список захватил кроме Позиционных, Гребенчатых и Цепных также и Узловую выноску. Она не очень нужна, (по крайней мере ею у нас позиции не ставят) но проблем с ее присутствием быть не должно, информация все равно должна отфильтроваться.
В список так же стали приписываться цифры 1 и 2 (наверное количество стрелок)
("Узел" "" "1" 1) ("Греб" "Выноска" 2)
Поскольку часть алгоритма для фильтров уже написана для списка не учитывая количество стрелок (да и вряд ли это нужно), думаю от этого нужно избавиться. Если не затруднит, то прошу это сделать.

VVA,
Цитата:
Из пункта A #445 я сделал только
Цитата:
Необходимо удалить дублирующие элементы
Тогда все нормально. А можно продолжить по требованиям понкта А и дальше?
__________________
Блог
Red Nova вне форума  
 
Непрочитано 30.09.2008, 08:11
#474
Кулик Алексей aka kpblc
Moderator

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


Red Nova, я количество сознательно сделал. В качестве задания: у тебя есть список вида
Код:
[Выделить все]
'(("Узел" "" "1" 1) ("Цепная" "Выноска" 2) ("Греб" "Выноска" 2) ("Поз" "Выноска" 1))
Надо из каждого подсписка удалить элементы, не являющиеся строками и получить на выходе
Код:
[Выделить все]
'(("Узел" "" "1") ("Цепная" "Выноска") ("Греб" "Выноска") ("Поз" "Выноска"))
Используемые функции: type. Возможно, понадобятся mapcar и vl-remoму-if или vl-remove-if-not.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 30.09.2008, 10:45
#475
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Провел сравнительный анализ, скорости выполнения разных вариантов программы. Результаты выкладываю.

Коды для сравнения:
Код:
[Выделить все]
(defun check_vk_v1 (var lst /)
 (setq var (strcat var "*"))
 (and
  (vl-member-if (function (lambda (e) (wcmatch e var))) lst)
 ) ;_  and
) ;_  defun
(defun check_eea_v1 (var lst)
 (vl-some (function (lambda (a) (= var a))) lst)
) ;_  defun
;;;Возвращает T если элемент var есть в списке lst
;;;Все переменные string
(defun check_VVA_v1 (var lst / flag tmp)
 (setq var (strcat var "*"))
 (while (and (not flag) lst)
  (setq tmp (car lst)
        lst (cdr lst)
  ) ;_  setq
  (if (wcmatch tmp var)
   (setq flag t)
  ) ;_  if
 ) ;_  while
 flag
) ;_  defun
;;;Возвращает T если элемент var есть в списке lst
;;;Все переменные string
;;;Вариант 2
(defun check_VVA_v2 (var lst / flag tmp)
 (setq var (strcat var "*")
       tmp (car lst)
       lst (cdr lst)
 ) ;_  setq
 (while (and (not (setq flag (wcmatch tmp var))) lst)
  (setq tmp (car lst)
        lst (cdr lst)
  ) ;_  setq
 ) ;_  while
 flag
) ;_  defun
(defun check3 (var lst / flag)
 (foreach tmp lst
  (if (= tmp (substr var 1 (strlen tmp)))
   (setq flag T)
  ) ;_  if
 ) ;_  foreach
 flag
) ;end of check3
(defun fun_check3_1 (var lst / flag)
 (foreach tmp lst
  (if (and (not flag) (= tmp (substr var 1 (strlen tmp)))) ;_ end of and
   (setq flag t)
  ) ;_ end of if
 ) ;_ end of foreach
 flag
) ;_ end of defun
(defun fun_check3_3 (var lst res) ; Пример вызова:
  ; (fun_check3_3 var lst 'result)
  ; Обрати внимание на апостроф перед последним параметром
  ; В этой переменной будет храниться результат выполнения
  ; fun_check_3
 (foreach tmp lst
  (if (and (not res) (= tmp (substr var 1 (strlen tmp)))) ;_ end of and
   (progn (set res t) (quit)) ;_ end of progn
  ) ;_ end of if
 ) ;_ end of foreach
) ;_ end of defun
Тестовый список:
Код:
[Выделить все]
(setq lst (list "-"           "Фл."         "Фл."
                "Фланец"      "Лист"        "Полоса"
                "\U+E72E"     "Тр"          "\U+E720"
                "Уголок"      "\U+E729"     "Двутавр"
                "\U+E725"     "Швеллер"     "%%c"
                "\U+E712"     "2%%c"        "3%%c"
                "4%%c"        "5%%c"        "6%%c"
                "7%%c"        "8%%c"        "9%%c"
                "10%%c"       "11%%c"       "12%%c"
                "13%%c"       "14%%c"       "15%%c"
                "16%%c"       "17%%c"       "18%%c"
                "19%%c"       "20%%c"       "2 %%c"
                "3 %%c"       "4 %%c"       "5 %%c"
                "6 %%c"       "7 %%c"       "8 %%c"
                "9 %%c"       "10 %%c"      "11 %%c"
                "12 %%c"      "13 %%c"      "14 %%c"
                "15 %%c"      "16 %%c"      "17 %%c"
                "18 %%c"      "19 %%c"      "20 %%c"
                "2\U+E712"    "3\U+E712"    "4\U+E712"
                "5\U+E712"    "6\U+E712"    "7\U+E712"
                "8\U+E712"    "9\U+E712"    "10\U+E712"
                "11\U+E712"   "12\U+E712"   "13\U+E712"
                "14\U+E712"   "15\U+E712"   "16\U+E712"
                "17\U+E712"   "18\U+E712"   "19\U+E712"
                "20\U+E712"   "2 \U+E712"   "3 \U+E712"
                "4 \U+E712"   "5 \U+E712"   "6 \U+E712"
                "7 \U+E712"   "8 \U+E712"   "9 \U+E712"
                "10 \U+E712"  "11 \U+E712"  "12 \U+E712"
                "13 \U+E712"  "14 \U+E712"  "15 \U+E712"
                "16 \U+E712"  "17 \U+E712"  "18 \U+E712"
                "19 \U+E712"  "20 \U+E712"
               )
)
Результаты сравнения - каждый раз указывался разный элемент списка...


первый элемент из 92
Код:
[Выделить все]
Benchmarking ...................Elapsed milliseconds / relative speed for 65536 iteration(s):

    (CHECK_VVA_V2 "-" LST)..................1437 / 8.47 <fastest>
    (CHECK_VVA_V1 "-" LST)..................1453 / 8.38
    (CHECK_EEA_V1 "-" LST)..................1594 / 7.64
    (CHECK_VK_V1 "-" LST)...................1609 / 7.56
    (FUN_CHECK3_3 "-" LST (QUOTE RET))......4641 / 2.62
    (FUN_CHECK3_1 "-" LST)..................4719 / 2.58
    (CHECK3 "-" LST).......................12172 / 1 <slowest>
21 элемент из 92

Код:
[Выделить все]
Benchmarking ...................Elapsed milliseconds / relative speed for 65536 iteration(s):

    (CHECK_EEA_V1 "6%%c" LST)..................1968 / 6.26 <fastest>
    (CHECK_VK_V1 "6%%c" LST)...................2329 / 5.29
    (CHECK_VVA_V1 "6%%c" LST)..................2891 / 4.26
    (CHECK_VVA_V2 "6%%c" LST)..................2891 / 4.26
    (FUN_CHECK3_3 "6%%c" LST (QUOTE RET))......4656 / 2.64
    (FUN_CHECK3_1 "6%%c" LST)..................6578 / 1.87
    (CHECK3 "6%%c" LST).......................12313 / 1 <slowest>
41 элемент из 92
Код:
[Выделить все]
Benchmarking ..................Elapsed milliseconds / relative speed for 32768 iteration(s):

    (CHECK_EEA_V1 "7 %%c" LST).................1203 / 5.1 <fastest>
    (CHECK_VK_V1 "7 %%c" LST)..................1485 / 4.14
    (CHECK_VVA_V1 "7 %%c" LST).................2062 / 2.98
    (CHECK_VVA_V2 "7 %%c" LST).................2094 / 2.93
    (FUN_CHECK3_3 "7 %%c" LST (QUOTE RET)).....2328 / 2.64
    (FUN_CHECK3_1 "7 %%c" LST).................4265 / 1.44
    (CHECK3 "7 %%c" LST).......................6141 / 1 <slowest>
71 элемент из 92
Код:
[Выделить все]
Benchmarking ..................Elapsed milliseconds / relative speed for 32768 iteration(s):

    (CHECK_EEA_V1 "18\U+E712" LST)...............1500 / 4.14 <fastest>
    (CHECK_VK_V1 "18\U+E712" LST)................2032 / 3.05
    (FUN_CHECK3_3 "18\U+E712" LST (QUOTE...).....2328 / 2.66
    (CHECK_VVA_V1 "18\U+E712" LST)...............3125 / 1.98
    (CHECK_VVA_V2 "18\U+E712" LST)...............3172 / 1.96
    (FUN_CHECK3_1 "18\U+E712" LST)...............5781 / 1.07
    (CHECK3 "18\U+E712" LST).....................6203 / 1 <slowest>
92 элемент из 92
Код:
[Выделить все]
Benchmarking ..................Elapsed milliseconds / relative speed for 32768 iteration(s):

    (CHECK_EEA_V1 "20 \U+E712" LST)..............1703 / 4 <fastest>
    (FUN_CHECK3_3 "20 \U+E712" LST (QUOT...).....2312 / 2.95
    (CHECK_VK_V1 "20 \U+E712" LST)...............2406 / 2.83
    (CHECK_VVA_V1 "20 \U+E712" LST)..............3860 / 1.77
    (CHECK_VVA_V2 "20 \U+E712" LST)..............3922 / 1.74
    (CHECK3 "20 \U+E712" LST)....................6156 / 1.11
    (FUN_CHECK3_1 "20 \U+E712" LST)..............6813 / 1 <slowest>
Елпанов Евгений вне форума  
 
Непрочитано 30.09.2008, 11:03
#476
Дима_

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


Цитата:
Сообщение от Елпанов Евгений Посмотреть сообщение
Провел сравнительный анализ, скорости выполнения разных вариантов программы. Результаты выкладываю.

Коды для сравнения:
Код:
[Выделить все]
(defun check_vk_v1 (var lst /)
 (setq var (strcat var "*"))
 (and
  (vl-member-if (function (lambda (e) (wcmatch e var))) lst)
 ) ;_  and
) ;_  defun
(defun check_eea_v1 (var lst)
 (vl-some (function (lambda (a) (= var a))) lst)
) ;_  defun
;;;Возвращает T если элемент var есть в списке lst
;;;Все переменные string
(defun check_VVA_v1 (var lst / flag tmp)
 (setq var (strcat var "*"))
 (while (and (not flag) lst)
  (setq tmp (car lst)
        lst (cdr lst)
  ) ;_  setq
  (if (wcmatch tmp var)
   (setq flag t)
  ) ;_  if
 ) ;_  while
 flag
) ;_  defun
;;;Возвращает T если элемент var есть в списке lst
;;;Все переменные string
;;;Вариант 2
(defun check_VVA_v2 (var lst / flag tmp)
 (setq var (strcat var "*")
       tmp (car lst)
       lst (cdr lst)
 ) ;_  setq
 (while (and (not (setq flag (wcmatch tmp var))) lst)
  (setq tmp (car lst)
        lst (cdr lst)
  ) ;_  setq
 ) ;_  while
 flag
) ;_  defun
(defun check3 (var lst / flag)
 (foreach tmp lst
  (if (= tmp (substr var 1 (strlen tmp)))
   (setq flag T)
  ) ;_  if
 ) ;_  foreach
 flag
) ;end of check3
(defun fun_check3_1 (var lst / flag)
 (foreach tmp lst
  (if (and (not flag) (= tmp (substr var 1 (strlen tmp)))) ;_ end of and
   (setq flag t)
  ) ;_ end of if
 ) ;_ end of foreach
 flag
) ;_ end of defun
(defun fun_check3_3 (var lst res) ; Пример вызова:
  ; (fun_check3_3 var lst 'result)
  ; Обрати внимание на апостроф перед последним параметром
  ; В этой переменной будет храниться результат выполнения
  ; fun_check_3
 (foreach tmp lst
  (if (and (not res) (= tmp (substr var 1 (strlen tmp)))) ;_ end of and
   (progn (set res t) (quit)) ;_ end of progn
  ) ;_ end of if
 ) ;_ end of foreach
) ;_ end of defun
[/code]
А что-ж check3_1 из #459 не добавил? Тоже хочу в соревновании побыть, правда для нее список маловат конечно.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 30.09.2008, 12:16
#477
CB

Конструирование в области нефтеразведки
 
Регистрация: 10.02.2006
Гомель
Сообщений: 321


А что, простой member уже снят со счетов? Или я чего-то не понял
Код:
[Выделить все]
(if (member var lst) t)
CB вне форума  
 
Непрочитано 30.09.2008, 12:30
#478
Кулик Алексей aka kpblc
Moderator

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


Похоже http://dwg.ru/f/showpost.php?p=290538&postcount=456
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 30.09.2008, 12:47
#479
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от Дима_ Посмотреть сообщение
А что-ж check3_1 из #459 не добавил? Тоже хочу в соревновании побыть, правда для нее список маловат конечно.
Приношу свои извинения.
Но советую исправить ошибки в своей программе check3_1...
Код:
[Выделить все]
(defun check3_1 (var lst / i tmp flag start end)
 (setq start -1
       end   (length lst)
 ) ;_  setq
 (while (and (/= (1+ start) end) (not flag))
  (setq i   (+ start (/ (- end start) 2))
        tmp (nth i lst)
  ) ;_  setq
  (if (= tmp (substr var 1 (strlen tmp)))
   (setq flag T)
   (if (< tmp var)
    (setq start i)
    (setq end i)
   ) ;_  if
  ) ;_  if
 ) ;_  while
 flag
)
список:
Код:
[Выделить все]
(setq lst (list "-"           "Фл."         "Фл."
                "Фланец"      "Лист"        "Полоса"
                "\U+E72E"     "Тр"          "\U+E720"
                "Уголок"      "\U+E729"     "Двутавр"
                "\U+E725"     "Швеллер"     "%%c"
                "\U+E712"     "2%%c"        "3%%c"
                "4%%c"        "5%%c"        "6%%c"
                "7%%c"        "8%%c"        "9%%c"
                "10%%c"       "11%%c"       "12%%c"
                "13%%c"       "14%%c"       "15%%c"
                "16%%c"       "17%%c"       "18%%c"
                "19%%c"       "20%%c"       "2 %%c"
                "3 %%c"       "4 %%c"       "5 %%c"
                "6 %%c"       "7 %%c"       "8 %%c"
                "9 %%c"       "10 %%c"      "11 %%c"
                "12 %%c"      "13 %%c"      "14 %%c"
                "15 %%c"      "16 %%c"      "17 %%c"
                "18 %%c"      "19 %%c"      "20 %%c"
                "2\U+E712"    "3\U+E712"    "4\U+E712"
                "5\U+E712"    "6\U+E712"    "7\U+E712"
                "8\U+E712"    "9\U+E712"    "10\U+E712"
                "11\U+E712"   "12\U+E712"   "13\U+E712"
                "14\U+E712"   "15\U+E712"   "16\U+E712"
                "17\U+E712"   "18\U+E712"   "19\U+E712"
                "20\U+E712"   "2 \U+E712"   "3 \U+E712"
                "4 \U+E712"   "5 \U+E712"   "6 \U+E712"
                "7 \U+E712"   "8 \U+E712"   "9 \U+E712"
                "10 \U+E712"  "11 \U+E712"  "12 \U+E712"
                "13 \U+E712"  "14 \U+E712"  "15 \U+E712"
                "16 \U+E712"  "17 \U+E712"  "18 \U+E712"
                "19 \U+E712"  "20 \U+E712"
               )
)

результаты тестирования:

первый элемент из 92
Код:
[Выделить все]
    (CHECK_VVA_V2 "-" LST)................1469 / 8.51 <fastest>
    (CHECK_VVA_V1 "-" LST)................1500 / 8.33
    (CHECK_EEA_V1 "-" LST)................1610 / 7.76
    (CHECK_VK_V1 "-" LST).................1656 / 7.55
    (CHECK3_1 "-" LST)....................2812 / 4.45
    (FUN_CHECK3_3 "-" LST (QUOTE A))......4796 / 2.61
    (FUN_CHECK3_1 "-" LST)................4828 / 2.59
    (CHECK3 "-" LST).....................12500 / 1 <slowest>

;(FUN_CHECK3_3 "-" LST (QUOTE A)) ; A = nil
;; 11 элемент из 92
Код:
[Выделить все]
    (CHECK_EEA_V1 "\U+E729" LST)................1859 / 6.77 <fastest>
    (CHECK_VK_V1 "\U+E729" LST).................2078 / 6.05
    (CHECK_VVA_V1 "\U+E729" LST)................2281 / 5.51
    (CHECK_VVA_V2 "\U+E729" LST)................2281 / 5.51
    (CHECK3_1 "\U+E729" LST)....................3266 / 3.85
    (FUN_CHECK3_3 "\U+E729" LST (QUOTE A))......4812 / 2.61
    (FUN_CHECK3_1 "\U+E729" LST)................5796 / 2.17
    (CHECK3 "\U+E729" LST).....................12579 / 1 <slowest>

;(CHECK3_1 "\U+E729" LST) =>> nil
;(FUN_CHECK3_3 "\U+E729" LST (QUOTE A)) ; A = nil
;; 21 элемент из 92
Код:
[Выделить все]
    (CHECK_EEA_V1 "6%%c" LST)...............1047 / 6.06 <fastest>
    (CHECK_VK_V1 "6%%c" LST)................1219 / 5.2
    (CHECK_VVA_V1 "6%%c" LST)...............1484 / 4.27
    (CHECK_VVA_V2 "6%%c" LST)...............1500 / 4.23
    (CHECK3_1 "6%%c" LST)...................1516 / 4.18
    (FUN_CHECK3_3 "6%%c" LST (QUOTE A)).....2406 / 2.64
    (FUN_CHECK3_1 "6%%c" LST)...............3406 / 1.86
    (CHECK3 "6%%c" LST).....................6344 / 1 <slowest>

;(CHECK3_1 "6%%c" LST) =>> nil
;(FUN_CHECK3_3 "6%%c" LST (QUOTE A)) ; A = nil
;; 31 элемент из 92
Код:
[Выделить все]
    (CHECK_EEA_V1 "16%%c" LST)...............1157 / 5.48 <fastest>
    (CHECK_VK_V1 "16%%c" LST)................1391 / 4.56
    (CHECK3_1 "16%%c" LST)...................1609 / 3.94
    (CHECK_VVA_V1 "16%%c" LST)...............1813 / 3.5
    (CHECK_VVA_V2 "16%%c" LST)...............1843 / 3.44
    (FUN_CHECK3_3 "16%%c" LST (QUOTE A)).....2406 / 2.64
    (FUN_CHECK3_1 "16%%c" LST)...............3891 / 1.63
    (CHECK3 "16%%c" LST).....................6344 / 1 <slowest>

;(CHECK3_1 "16%%c" LST) =>> nil
;(FUN_CHECK3_3 "16%%c" LST (QUOTE A)) ; A = nil
;; 41 элемент из 92
Код:
[Выделить все]
    (CHECK_EEA_V1 "7 %%c" LST)...............1250 / 5.09 <fastest>
    (CHECK3_1 "7 %%c" LST)...................1516 / 4.19
    (CHECK_VK_V1 "7 %%c" LST)................1531 / 4.15
    (CHECK_VVA_V1 "7 %%c" LST)...............2141 / 2.97
    (CHECK_VVA_V2 "7 %%c" LST)...............2172 / 2.93
    (FUN_CHECK3_3 "7 %%c" LST (QUOTE A)).....2422 / 2.63
    (FUN_CHECK3_1 "7 %%c" LST)...............4437 / 1.43
    (CHECK3 "7 %%c" LST).....................6359 / 1 <slowest>

;(CHECK3_1 "7 %%c" LST) =>> nil
;(FUN_CHECK3_3 "7 %%c" LST (QUOTE A)) ; A = nil
;; 51 элемент из 92
Код:
[Выделить все]
    (CHECK_EEA_V1 "17 %%c" LST)...............1375 / 4.67 <fastest>
    (CHECK3_1 "17 %%c" LST)...................1516 / 4.24
    (CHECK_VK_V1 "17 %%c" LST)................1735 / 3.7
    (FUN_CHECK3_3 "17 %%c" LST (QUOTE A)).....2406 / 2.67
    (CHECK_VVA_V1 "17 %%c" LST)...............2484 / 2.59
    (CHECK_VVA_V2 "17 %%c" LST)...............2531 / 2.54
    (FUN_CHECK3_1 "17 %%c" LST)...............4969 / 1.29
    (CHECK3 "17 %%c" LST).....................6422 / 1 <slowest>

;(CHECK3_1 "17 %%c" LST) =>> nil
;(FUN_CHECK3_3 "17 %%c" LST (QUOTE A)) ; A = nil
;; 61 элемент из 92
Код:
[Выделить все]
    (CHECK_EEA_V1 "8\U+E712" LST)...............1468 / 4.32 <fastest>
    (CHECK3_1 "8\U+E712" LST)...................1640 / 3.87
    (CHECK_VK_V1 "8\U+E712" LST)................1906 / 3.33
    (FUN_CHECK3_3 "8\U+E712" LST (QUOTE A)).....2407 / 2.64
    (CHECK_VVA_V1 "8\U+E712" LST)...............2860 / 2.22
    (CHECK_VVA_V2 "8\U+E712" LST)...............2922 / 2.17
    (FUN_CHECK3_1 "8\U+E712" LST)...............5407 / 1.17
    (CHECK3 "8\U+E712" LST).....................6343 / 1 <slowest>

;(CHECK3_1 "8\U+E712" LST) =>> nil
;(FUN_CHECK3_3 "8\U+E712" LST (QUOTE A)) ; A = nil
;; 71 элемент из 92
Код:
[Выделить все]
    (CHECK_EEA_V1 "18\U+E712" LST)...............1578 / 4.03 <fastest>
    (CHECK3_1 "18\U+E712" LST)...................1625 / 3.91
    (CHECK_VK_V1 "18\U+E712" LST)................2109 / 3.02
    (FUN_CHECK3_3 "18\U+E712" LST (QUOTE A)).....2406 / 2.64
    (CHECK_VVA_V1 "18\U+E712" LST)...............3235 / 1.97
    (CHECK_VVA_V2 "18\U+E712" LST)...............3297 / 1.93
    (FUN_CHECK3_1 "18\U+E712" LST)...............5969 / 1.07
    (CHECK3 "18\U+E712" LST).....................6359 / 1 <slowest>

;(FUN_CHECK3_3 "18\U+E712" LST (QUOTE A)) ; A = nil
;; 81 элемент из 92
Код:
[Выделить все]
    (CHECK3_1 "9 \U+E712" LST)...................1141 / 5.67 <fastest>
    (CHECK_EEA_V1 "9 \U+E712" LST)...............1672 / 3.87
    (CHECK_VK_V1 "9 \U+E712" LST)................2281 / 2.84
    (FUN_CHECK3_3 "9 \U+E712" LST (QUOTE A)).....2422 / 2.67
    (CHECK_VVA_V1 "9 \U+E712" LST)...............3594 / 1.8
    (CHECK_VVA_V2 "9 \U+E712" LST)...............3641 / 1.78
    (CHECK3 "9 \U+E712" LST).....................6375 / 1.01
    (FUN_CHECK3_1 "9 \U+E712" LST)...............6469 / 1 <slowest>
     
;(FUN_CHECK3_3 "9 \U+E712" LST (QUOTE A)) ; A = nil
;; 92 элемент из 92
Код:
[Выделить все]
    (CHECK3_1 "20 \U+E712" LST)..................1047 / 4.6 <fastest>
    (CHECK_EEA_V1 "20 \U+E712" LST)..............1360 / 3.54
    (CHECK_VK_V1 "20 \U+E712" LST)...............1734 / 2.78
    (FUN_CHECK3_3 "20 \U+E712" LST (QUOTE A)).....1969 / 2.44
    (CHECK_VVA_V2 "20 \U+E712" LST)..............3078 / 1.56
    (CHECK_VVA_V1 "20 \U+E712" LST)..............3141 / 1.53
    (CHECK3 "20 \U+E712" LST)....................4250 / 1.13
    (FUN_CHECK3_1 "20 \U+E712" LST)..............4813 / 1 <slowest>

;(CHECK3_1 "20 \U+E712" LST) =>> nil
;(FUN_CHECK3_3 "20 \U+E712" LST (QUOTE A)) ; A = nil
Елпанов Евгений вне форума  
 
Непрочитано 30.09.2008, 12:48
#480
Дима_

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


А "простым" memberom не получиться ибо:
Код:
[Выделить все]
Команда: (member "12" (list "123" "456" "789"))
nil
А у нас должно быть T
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
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