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

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

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

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

Со школы не ладится у меня с программированием. Все предметы щелкал, а на экзамене по информатике (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.
Просмотров: 1972717
 
Автор темы   Непрочитано 27.09.2008, 15:10
#441
Red Nova

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


kpblc, CB
Ребята, протестируйте пожалуйста код с #427, у Димы СПДС нет, а я никак не найду где ошибка.

Дима_ Пробовал добавить в filtr по отдельности check2 и check2, не работает ни в какую.
__________________
Блог
Red Nova вне форума  
 
Автор темы   Непрочитано 27.09.2008, 19:57
#442
Red Nova

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


СВ
Пытался соеденить твой код с кодом #404 от крыса, нечего не вышло. Как это правильно сделать?
__________________
Блог
Red Nova вне форума  
 
Непрочитано 28.09.2008, 00:55
#443
Дима_

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


АААААА! Вдарьте мне кирпичом, исправил в #428 - не ругайтесь строго, не тот элемент выравнивал - не из объекта, а из spisk'а - см. check3. А в тестовых моих они одинаковой длинны были.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 28.09.2008, 11:04
#444
CB

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


К сожалению СПДС нет и у меня, но я ориентировался на
Цитата:
Кулик Алексей aka kpblc,
Спасибо, список из содержаний позиционных выносок создается
в http://dwg.ru/f/showthread.php?t=24951 #3
Лисп в #2 (по этой же ссылке) создает правильный список или нет?
Если да, то тогда нужно нужно ориентироваться именно на этот лисп...
CB вне форума  
 
Автор темы   Непрочитано 28.09.2008, 13:40
#445
Red Nova

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


Дима_
Заработало!!!
Фильтр готов. Спасибо большое.
Теперь у нас уже есть отфильтрованный от мусора список.
Я немного изменил список (spisok), и теперь наша функция такова.
Код:
[Выделить все]
(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 tmp))))
);end of foreach
newlst
);end filtr


(defun check2 (tmp / i str); возращает T либо nil в зависимости от соответствия 2-му условию
(setq i 1 str tmp)
(if (or (= (substr str (strlen str)) "'") (= (substr str (strlen str)) "\"")); если последний ' или "
(setq str (substr str 1 (1- (strlen str))))); убирает последний символ
(repeat (strlen str)
(if (and (>= (substr str i 1) "0") (<= (substr str i 1) "9")); проверка цифра ли это?
(setq str (strcat (substr str 1 (1- i)) (substr str (1+ i)))); если да то убираем ее из str
(setq i (1+ i)); переход к следующими символу, если не было вычитания
);end of if
);end of repeat
; таким образом мы убрали из str все цифры и символы на конце 'и"
(<= (strlen str) 1); остался только 1 символ или меньше?
);end of check2


(defun check3 (var lst / flag) 
(foreach tmp lst
(if (= tmp (substr var 1 (strlen tmp))) (setq flag T))
)
flag 
);end of check3
  (defun _dwgru-conv-pickset-to-list (value / tab item)
    (repeat (setq tab  nil
                  item (sslength value)
                  ) ;_ end setq
      (setq tab (cons (ssname value (setq item (1- item))) tab))
      ) ;_ end repeat
    ) ;_ end defun


(defun test (/ lst selset spisok)
  (if
    (and (setq selset (ssget))
         (setq
           selset (vl-remove-if-not
                    (function (lambda (x)
                                (= (cdr (assoc 0 (entget x))) "spdsNotePosition")
                                ) ;_ end of LAMBDA
                              ) ;_ end of function
                    (_dwgru-conv-pickset-to-list selset)
                    ) ;_ end of vl-remove-if-not
           ) ;_ end of setq
         ) ;_ end of and
     (setq
       lst
        (vl-sort
          (vl-remove-if
            (function
              (lambda (a)
                (= (cadr a) "")
                ) ;_ end of lambda
              ) ;_ end of function
            (mapcar (function
                      (lambda (obj)
                        (mapcar (function cdr)
                                (vl-remove-if-not
                                  (function
                                    (lambda (x)
                                      (= (car x) 300)
                                      ) ;_ end of lambda
                                    ) ;_ end of function
                                  (member '(301 . "Первая строка") (entget obj))
                                  ) ;_ end of vl-remove-if-not
                                ) ;_ end of mapcar
                        ) ;_ end of LAMBDA
                      ) ;_ end of function
                    selset
                    ) ;_ end of mapcar
            ) ;_ end of vl-remove-if
          (function (lambda (a b) (< (car a) (car b))))
          ) ;_ end of vl-sort
       ) ;_ end of setq
     ) ;_ end of if

  
(setq spisok (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"))

(setq lst (filtr lst)) ; можно и просто оставить в первом setq - но чтоб было понятней.
);end of test

1. Теперь о продолжении.

На пример, в результате фильтрации мы получили такой список.
Код:
[Выделить все]
(("1" "-10х100x200") ("1" "-10х100x200") ("2" "Швеллер 12, L=1000, шаг 1000") ("2" "Швеллер 12, L=1000") ("2" "Швеллер 12") ("3" "12 Ас1, ΣL=10000") ("3" "12 Ас1") ("4" "20 Ас1") ("5" "8 20 А500c, L=1000") ("5" "8 20 А500c"))
А. Необходимо удалить дублирующие элементы.
Видно, что некоторые элементы дублируются абсолютно идентично.
("1" "-10х100x200") ("1" "-10х100x200)
А у некоторых одинаков только номер позиции
("2" "Швеллер 12, L=1000, шаг 1000") ("2" "Швеллер 12, L=1000") ("2" "Швеллер 12")
("5" "8 20 А500c, L=1000") ("5" "8 20 А500c")
Для правильной фильтрации дублирующих элементов Необходимо произвести сравнение первых и вторых элементов подсписка.
Если оба элемента идентичны, то оставляем только один подсписок.
Если идентичны только номера позиций, а содержание разное, то надо оставить на первом этапе более длинный подсписок.
Таким образом наш список превратится в
Код:
[Выделить все]
( ("1" "-10х100x200") ("2" "Швеллер 12, L=1000, шаг 1000") ("3" "12 Ас1, ΣL=10000") ("3" "12 Ас1") ("4" "20 Ас1") ("5" "8 20 А500c, L=1000"))
B. Теперь из подсписков надо удалить информацию, которая в спецификации непригодна.
Вот такие подсписки, которые содержат лишнюю информацию.
("2" "Швеллер 12, L=1000, шаг 1000")
("5" "8 20 А500c")
B.1 Алгоритм должен отслеживать есть ли во второй строке запятые . Не уверен, но если в русской и английской раскладке запятым соответствуют разные символы, то надо учесть оба. Если в строке больше одной запятой, то надо удалить все что идет после второй (вместе с запятой).
B.2 Алгоритм должен также проверить начинается ли вторая строка с “цифра пробел диаметр”, или с “цифра диаметр” где диаметр может писаться двумя кодами. Вот список всех возможных комбинаций:
Код:
[Выделить все]
(list "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")
Если вторая строка начинается с этих элементов, то надо удалить все до знака диаметр.

Список должен после этого стать таким
Код:
[Выделить все]
( ("1" "-10х100x200") ("2" "Швеллер 12, L=1000") ("3" "12 Ас1, ΣL=10000") ("3" "12 Ас1") ("4" "20 Ас1") ("5" "20 А500c, L=1000"))
2. Вопросы
Топик все же обучающий. И хотя мне подсознательно очень хочется получить готовый лисп, я все же хотел бы и сам что-то сделать. Размышлял как самому написать фильтры условия А и В. Для этого сначала надо понять каков принцип работы check3
Попытаюсь разобраться вот в этом.
Код:
[Выделить все]
....
(check3 (cadr tmp) spisok)
....
(defun check3 (var lst / flag) 
(foreach tmp lst
(if (= tmp (substr var 1 (strlen tmp))) (setq flag T))
)
flag 
);end of check3
Ясно что (check3 (cadr tmp) spisok) должен вернуть либо T либо nil.
(substr var 1 (strlen tmp))
Из справки я знаю что strlen вернет количество символов в списке tmp а substr должен вернуть то что получится если от значения var обрубить все что длиннее чем tmp. А вот чему равно var я не знаю.
Прошу объяснить.
__________________
Блог

Последний раз редактировалось Red Nova, 29.09.2008 в 21:39.
Red Nova вне форума  
 
Автор темы   Непрочитано 28.09.2008, 13:47
#446
Red Nova

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


CB,
Ошибка уже нашлась. Теперь все работает. Поскольку со многими вариантами мне не совладать, решил продолжать с алгоритмом от Димы, Если еще не надоело помогать, почитай пожалуйста мой предыдущий пост. Там я описал продолжение, и вопрос про алгоритм Димы.
__________________
Блог
Red Nova вне форума  
 
Непрочитано 28.09.2008, 15:06
#447
Дима_

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


Ну Семен Семенович:
(check3 (cadr tmp) spisok)
....
(defun check3 (var lst / flag)

var - это аргумент который передается функции, насчет запятой она в обоих раскладках одинаковая.
Пилите Шура (я про варианты а и б), что не будет получаться пиши.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 28.09.2008, 17:16
#448
Red Nova

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


Дима_,
Эх коротковато ты объясняешь. Чайник как я не поймет.
Прошу пошагово объяснить вот это
Код:
[Выделить все]
....
(check3 (cadr tmp) spisok)
....
(defun check3 (var lst / flag) 
(foreach tmp lst
(if (= tmp (substr var 1 (strlen tmp))) (setq flag T))
)
flag 
);end of check3
__________________
Блог
Red Nova вне форума  
 
Непрочитано 28.09.2008, 19:40
#449
Дима_

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


Цитата:
Сообщение от Red Nova Посмотреть сообщение
Дима_,
Эх коротковато ты объясняешь. Чайник как я не поймет.
Прошу пошагово объяснить вот это
Код:
[Выделить все]
....
(check3 (cadr tmp) spisok)
....
(defun check3 (var lst / flag) 
(foreach tmp lst ; создает переменную циклично принимающию значения элементов списка lst
(if (= tmp (substr var 1 (strlen tmp))) (setq flag T)); если первые буквы переданного параметра var совпадают с значением tmp устанавливаем переменную flag
);конец цикла foreach
flag ; таким образом если было хотя бы одно совпадение функция check3 вернет значение T
);end of check3
Вобще если есть желание потренироваться, попробуй сам написать аналогичную функцию, но которая не проверяет весь список (как эта), а заканчивается при первом совпадении - не проверяя список до конца, если сам смогешь ИХМО - будет неплохая практика.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 28.09.2008, 21:51
#450
Кулик Алексей aka kpblc
Moderator

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


Дима_, простыми вариантами в лиспе такое не реализовывается, по-моему. В лиспе нет ведь принудительного выхода из списка (в отличие от VB(A), C++, C# etc) без выхода из функции. (exit) и (quit), по-моему, здесь не сработают. Единственный вариант - использовать set вместо setq, но и он вряд ли даст ожидаемый эффект.
P.S. мне лениво разбираться с кодом и пытаться выяснить, что передается в качестве параметров вызова check3, но вот 3 варианта кода:
Код:
[Выделить все]
(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_2 (var lst / flag)
  (foreach tmp lst
    (if (= tmp (substr var 1 (strlen tmp)))
      (progn
        (setq flag t)
        (quit)
        ) ;_ end of progn
      ) ;_ 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
Анализ кода оставлю вам
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 28.09.2008, 22:09
#451
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Дима_, простыми вариантами в лиспе такое не реализовывается, по-моему. В лиспе нет ведь принудительного выхода из списка (в отличие от VB(A), C++, C# etc) без выхода из функции.
Не претендую на оригинальность, но можно попробовать перебрать список через while
Код:
[Выделить все]
;;;Возвращает T если элемент var есть в списке lst
(defun check_VVA (var lst / flag tmp)
  (while (and (not flag) lst)
    (setq tmp (car lst) lst (cdr lst))
    (if (equal var tmp 1e-6)(setq flag t))
    )
  flag
  )
Benchmark
Код:
[Выделить все]
(setq lst '("0" "11" "2" "3" "1" "2" "3"))
          (BenchMark
             '(
               (check_VVA "1" lst)
	       (fun_check3_1 "1" lst)
	       (fun_check3_3 "1" lst 'ret)
              )
          )
Цитата:
Benchmarking ..................Elapsed milliseconds / relative speed for 32768 iteration(s):

(CHECK_VVA "1" LST)....................1593 / 1.28 <fastest>
(FUN_CHECK3_3 "1" LST (QUOTE RET)).....1703 / 1.19
(FUN_CHECK3_1 "1" LST).................2032 / 1 <slowest>
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 28.09.2008, 22:19
#452
Кулик Алексей aka kpblc
Moderator

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


Нда, что-то я про while забыл напрочь ) Вай-вай, виноват по самое не могу!
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 28.09.2008, 23:24
#453
Дима_

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


А так хотелось чтоб Red Nova сам что-то изобразил.
P.S. А кстати если вставишь в (parsing) вместо check3 check_vva, у тебя появиться логическая ошибка - работать будет но неправильно - попробуй опредили почему, а если и сам исправишь...
P.P.S. Искать естественно внутри check_vva надо.
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 28.09.2008 в 23:34.
Дима_ вне форума  
 
Непрочитано 29.09.2008, 10:43
#454
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Пока Red Nova занят домашними заданиями, немного модифицированные ф-ции
Код:
[Выделить все]
;;;Возвращает 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))
    (if (wcmatch tmp var)(setq flag t))
    )
  flag
  )

;;;Возвращает T если элемент var есть в списке lst
;;;Все переменные string
;;;Вариант 2
(defun check_VVA_v2 (var lst / flag tmp)
  (setq var (strcat var "*")
        tmp (car lst)
        lst (cdr lst))
  (while (and (not(setq flag (wcmatch tmp var))) lst)
    (setq tmp (car lst) lst (cdr lst))
    )
  flag
  )


(defun check3 (var lst / flag) 
(foreach tmp lst
(if (= tmp (substr var 1 (strlen tmp))) (setq flag T))
)
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 '("0" "11" "2" "3" "1CT" "2" "3"))
          (BenchMark
             '(
               (check_VVA_v1 "1C" lst)
               (check_VVA_v2 "1C" lst)
	       (fun_check3_1 "1C" lst)
	       (fun_check3_3 "1C" lst 'ret)
              )
          )
Цитата:
Benchmarking .................Elapsed milliseconds / relative speed for 16384 iteration(s):

(CHECK_VVA_V2 "1C" LST).................1109 / 1.24 <fastest>
(CHECK_VVA_V1 "1C" LST).................1141 / 1.21
(FUN_CHECK3_3 "1C" LST (QUOTE RET)).....1172 / 1.17
(CHECK3 "1C" LST).......................1328 / 1.04
(FUN_CHECK3_1 "1C" LST).................1375 / 1 <slowest>
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 29.09.2008, 10:53
#455
Red Nova

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


VVA, Сегодня на работе все с ума сошли. Не получится самому что-то попробовать, душат со всех сторон. Не успею даже толком ознакомится с твоим кодом, но если это то о чем я говорил в посте #445, то прошу соеденить это с главным кодом, последняя версия которого находится на #445 (первый код)
__________________
Блог
Red Nova вне форума  
 
Непрочитано 29.09.2008, 10:59
#456
Кулик Алексей aka kpblc
Moderator

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


А, еще один момент - (member) можно посмотреть )
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 29.09.2008, 11:19
#457
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992
<phrase 1= Отправить сообщение для VVA с помощью Skype™


По поводу #445 A.
Здесь 1001 алгоритм удаления дублирующих элементов. Форум требует регистрации.
Приведу первые 2 по скорости алгоритма:
Алгоритм MP1
Код:
[Выделить все]
(defun RemoveDuplicates-mp1 ( lst / foo temp )
    (defun foo (x)
        (cond
            ((vl-position x temp) t)
            ((setq temp (cons x temp)) nil)
        )
    )
    (vl-remove-if 'foo lst)
)
Алгоритм gile
Код:
[Выделить все]
(defun remove_doubles (lst)
  (if lst
    (cons (car lst) (remove_doubles (vl-remove (car lst) lst)))
  )
)
Ну и мой алгоритм. Не самый быстрый, но адаптирован для сравнения вещественных чисел, когда должно выполняться равенство 0.99999999=1
Код:
[Выделить все]
;;;Удаляет одинаковые (дубликаты) элементы из списка
;;; На основе http://www.theswamp.org/index.php?topic=19128.0
;;; Изменено для сравнения вещественных чисел (equal ... 1e-6)
(defun mip_MakeUniqueMembersOfList  ( lst / OutList head)
  (while lst
    (setq head (car lst)
          lst (vl-remove-if '(lambda(pt)(equal pt head 1e-6))(cdr lst))
          OutList (append OutList (list head))))
  OutList
  )
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 29.09.2008 в 11:44.
VVA вне форума  
 
Непрочитано 29.09.2008, 11:27
#458
CB

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


>Red Nova #453
Прежде чем помогать дальше, лично я хотел бы для начала разобраться со списком spisok, а именно:
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"не может быть?
Ну и еще одна ф-ция для удаления дубликатов:
Код:
[Выделить все]
 
(defun while-remove-lst (lst / temp)
  (while lst
    (setq temp (cons (car lst) temp))
    (setq lst (vl-remove (car lst) (cdr lst)))
  ) ;_ end of while
  (reverse temp)
) ;_ end of defun
;;;(while-remove-lst lst)
CB вне форума  
 
Непрочитано 29.09.2008, 12:28
#459
Дима_

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


Цитата:
Сообщение от VVA Посмотреть сообщение
Пока Red Nova занят домашними заданиями, немного модифицированные ф-ции
Под словом модифицированные я понимаю "оптимизированные" , это моя слабость, ни что так не оптимизирует процесс, как алгоритм
"Скорострельность" проверять на больших списках (например из #445), предварительно отсортированных - (setq spisok (vl-sort spisok '<))
Код:
[Выделить все]
(defun check3_1 (var lst / i tmp flag start end)
(setq start -1 end (length lst))
(while (and (/= (1+ start) end) (not flag))
(setq i (+ start (/ (- end start) 2)) tmp (nth i lst))
(if 	(= tmp (substr var 1 (strlen tmp)))
	(setq flag T)
	(if (< tmp var) (setq start i) (setq end i))
)
)
flag
)
P.S. Red Nova - прости что глумимся в твоей ветке.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 29.09.2008, 12:57
#460
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Дима_,
Даже на больших и отсортированных списках benchmark дает
Код:
[Выделить все]
(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"))
(setq lst (vl-sort lst '<))
          (BenchMark
             '(
               (check_VVA_v1 "16 %%c" lst)
               (check_VVA_v2 "16 %%c" lst)
	       (fun_check3_1 "16 %%c" lst)
               (check3_1 "16 %%c" lst)
               (check3 "16 %%c" lst)
	       (fun_check3_3 "16 %%c" lst 'ret)
              )
          )
Цитата:
Benchmarking .................Elapsed milliseconds / relative speed for 16384 iteration(s):

(CHECK_VVA_V2 "16 %%c" LST).................1703 / 3.53 <fastest>
(CHECK_VVA_V1 "16 %%c" LST).................1750 / 3.44
(CHECK3_1 "16 %%c" LST).....................2219 / 2.71
(FUN_CHECK3_3 "16 %%c" LST (QUOTE RET)).....2984 / 2.02
(FUN_CHECK3_1 "16 %%c" LST).................3484 / 1.73
(CHECK3 "16 %%c" LST).......................6016 / 1 <slowest>
Можешь погонять сам. Код benchmark можно взять, например, отсюда (требуется регистрация) или отсюда
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
Ответ
Вернуться   Форум 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