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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > В LISPе нет или не нашел?

В LISPе нет или не нашел?

Ответ
Поиск в этой теме
Непрочитано 31.05.2006, 03:06 #1
В LISPе нет или не нашел?
mmax
 
Программист широкого профиля.
 
Челябинск
Регистрация: 08.09.2005
Сообщений: 722

Заметил Несколько недостатков:
В лиспе нет:
генератора случайных чисел -- пока не решил для чего он мне нужен.

числовых последовательностей -- Нужен список чисел от 1 до 1000 с шагом 1, можно написать вручную но это долго, а если понадобится с шагом 0,23561? Пробовал i+1 и 1+ через mapcar и другие подобные функции, ничего не получилось.

справки по методам -- через vlax-dump-object можно получить необходимые методы, а как ими пользоваться незнаю?
Просмотров: 4689
 
Непрочитано 31.05.2006, 08:52
#2
Кулик Алексей aka kpblc
Moderator

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


http://dwg.ru/forum/viewtopic.php?t=6282 - здесь кое-что рассматривали вроде как...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 31.05.2006, 10:07
#3
AY

webcad.pro
 
Регистрация: 06.01.2005
Московская обл.
Сообщений: 501


>mmax
Генератор случайных чисел есть в небезызвестной библиотеке doslib функция (dos_random). Ее описание и применение можно посмотреть в справке. А насчет последовательностей тоже никаких трудностей - например такой вариант:
Код:
[Выделить все]
(defun num-list (start end step)
    (if (>= end start)
        (cons start (num-list (+ start step) end step))
        nil
    )
)
;;; пример
;;;(num-list 1 20 1)
;;;(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20)
Что касается методов и свойств - надо справу к VBA смотреть.
AY вне форума  
 
Автор темы   Непрочитано 01.06.2006, 14:07
#4
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


(num-list 1 19900 1) --Возвращает список (1.....19000)
(num-list 1 20000 1) --Уже не возвращает ничего

Точный порог не нашел еще, но хотелось бы без порога.

Этот список нужен для получения списка имен примитивов из набора через функцию ssname, для последующей передачи спика с примитивами в функцию entmud

Функция (ssname набор 60000) работает несмотря на ограничение в 32764 указанное в справке.
mmax вне форума  
 
Непрочитано 01.06.2006, 14:16
#5
Кулик Алексей aka kpblc
Moderator

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


Гхм... А зачем так-то?
Код:
[Выделить все]
(if (setq selset (ssget))
  (foreach ent (vl-remove-if 'listp (mapcar 'cadr (ssnamex selset)))
;;; Что-то творим с примитивом ent, его состав получаем через (entget ent)
   ) ;_ end of foreach
  ) ;_ end of if

(if (setq selset (ssget))
  (foreach ent (mapcar 'entget (vl-remove-if 'listp (mapcar 'cadr (ssnamex selset))))
;;; Что-то творим с составом получаем через ent
   ) ;_ end of foreach
  ) ;_ end of if
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 01.06.2006, 14:31
#6
VVA

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


В num-list использована рекурсия, а глубокие рекурсии не есть хорошо.
Может так как крыс предложил
VVA вне форума  
 
Автор темы   Непрочитано 01.06.2006, 22:51
#7
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Код:
[Выделить все]
(setq ss_get (ssget (list  (cons 0 "LINE"))))
(setq ss_length (1- (sslength ss_get)))

(setq ss_sp (ssnamex ss_get ))
(setq ss_prim  (reverse  (mapcar '(lambda (x) (nth 1 x)) ss_sp)))
(setq ss_prim_only (vl-remove-if 'listp ss_prim))
(vl-list-length ss_prim_only)
Впринципе мне нужен только список и именами примитивов, а так как SSNAMEX возвращает всякий мусор, то она не очень пригодна для сбора имен.
Вышеуказанный код работает, но яхотел так

Код:
[Выделить все]
(mapcar '(lambda (x) 
         (ssname ss_get x)
                    от 0 до Кол-ва выбранных примитивов)))
или чтото в этом роде.
В отличии от ssnameX ssnamE возвращает только имя и ничего больше, поэтому и возвращаемый результат должен быть более стабильым.
Вот только надо сформировать последовательность в зависимости от количества выбраных линий, но пока мы можем получить только от (0 до 19000)
mmax вне форума  
 
Непрочитано 02.06.2006, 08:24
#8
Кулик Алексей aka kpblc
Moderator

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


(vl-remove-if 'listp (mapcar 'cadr (ssnamex selset))
Возвращает список ename-примитивов, попавших в примитив. А уж что там ты будешь с ними делать, это только твоей фантазией ограничено
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 02.06.2006, 10:39
#9
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392


Раз уж заговорили про (vl-remove-if), то вот проблемка. Необходимо сделать удаление повторно встречающихся элементов списка, оставляя при этом первое вхождение, т.е. чтобы из
Код:
[Выделить все]
(a d g r v a s g h)
получилось
Код:
[Выделить все]
(a d g r v s h)
По случаю оскудения идеями требуется помощь коллектива.
Лентяй вне форума  
 
Непрочитано 02.06.2006, 11:14
#10
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,186
<phrase 1=


Код:
[Выделить все]
(defun test (list_0 / list_1)
  (FOREACH i list_0
    (if	(not (member i list_1))
      (setq list_1 (cons i list_1))
    )
  )
  (reverse list_1)
)
;;;(test '("a" "d" "g" "r" "v" "a" "s" "g" "h")) --> ("a" "d" "g" "r" "v" "s" "h")
Совсем обленился
__________________
apel.fas
Apelsinov вне форума  
 
Непрочитано 02.06.2006, 11:16
#11
Кулик Алексей aka kpblc
Moderator

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


Ох и огребу же я сейчас!
Код:
[Выделить все]
  (setq aa '("a" "d" "g" "r" "v" "a" "s" "g" "h"))
  (mapcar '(lambda (x)
	     (if (not (member x res))
	       (setq res (append res (list x)))
	       ) ;_ end of if
	     ) ;_ end of LAMBDA
	  aa
	  ) ;_ end of mapcar
  res
Как только профи подключатся, тут же найдется более изящное и правильное решение
---
Добавлено:
Цитата:
Как только профи подключатся, тут же найдется более изящное и правильное решение
читать как
Цитата:
Как только профи подключатся, тут же найдется более изящное и правильное решение, чем мое
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 02.06.2006, 11:24
#12
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392


Всем спасибо , хотя kpblc-ятина мне нравится больше. :P
Лентяй вне форума  
 
Непрочитано 02.06.2006, 11:31
#13
Кулик Алексей aka kpblc
Moderator

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


А фактически что одно, что другое. Разницы почти никакой. foreach я тоже первым сделал А потом просто на mapcar заменил
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 02.06.2006, 14:29
#14
Елпанов Евгений

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


Решил внести некоторую ясность по скорости и переделкам...
Код:
[Выделить все]
(defun test1 (list_0 / list_1)
  (FOREACH i list_0
    (if	(not (member i list_1))
      (setq list_1 (cons i list_1))
    ) ;_  if
  ) ;_  FOREACH
  (reverse list_1)
) ;_  defun
(defun test2 (aa / res)
  (mapcar
    '(lambda (x)
       (if (not (member x res))
	 (setq res (append res (list x)))
       ) ;_ end of if 
     ) ;_ end of LAMBDA 
    aa
  ) ;_ end of mapcar
  res
) ;_  defun
(defun test3 (lst / list_1)
  (if lst
    (cons (car lst) (test3 (vl-remove (car lst) (cdr lst))))
  ) ;_  if
) ;_  defun
(defun test4 (lst)
  (mapcar 'chr (vl-sort (mapcar 'ascii lst) '<))
) ;_  defun
(defun test5 (lst / res)
  (while lst
    (setq res (cons (car lst) res)
	  lst (vl-remove (car lst) (cdr lst))
    ) ;_  setq
  ) ;_  while
  (reverse res)
) ;_  defun
(BenchMark '(
	     (test1 '("a" "d" "g" "r" "v" "a" "s" "g" "h"))
	     (test2 '("a" "d" "g" "r" "v" "a" "s" "g" "h"))
	     (test3 '("a" "d" "g" "r" "v" "a" "s" "g" "h"))
	     (test4 '("a" "d" "g" "r" "v" "a" "s" "g" "h"))
	     (test5 '("a" "d" "g" "r" "v" "a" "s" "g" "h"))
	    )
) ;_  BenchMark
Benchmarking .................Elapsed milliseconds / relative speed for 16384 iteration(s):

    (TEST3 (QUOTE ("a" "d" "g" "r" "v" ...).....1484 / 1.23 <fastest>
    (TEST5 (QUOTE ("a" "d" "g" "r" "v" ...).....1500 / 1.22
    (TEST4 (QUOTE ("a" "d" "g" "r" "v" ...).....1703 / 1.07
    (TEST1 (QUOTE ("a" "d" "g" "r" "v" ...).....1734 / 1.05
    (TEST2 (QUOTE ("a" "d" "g" "r" "v" ...).....1828 / 1.00 <slowest>
Результаты сравнения можно объяснить так: за время однократного выполнения TEST2 - функция TEST3 успевает выполниться на 123%
Елпанов Евгений вне форума  
 
Непрочитано 02.06.2006, 23:42
#15
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392


Цитата:
Сообщение от kpblc
А фактически что одно, что другое. Разницы почти никакой. foreach я тоже первым сделал А потом просто на mapcar заменил
Неправда ваша, ибо апельсины работают, а вот крысятина - нет. :evil: Выдает, панимаш, тройной список (((x y z))... ((a b c))), в котором каждый элемент - двойной список. Вот и верь после этого привлекательным формам! Гусары, молчать!
Лентяй вне форума  
 
Непрочитано 03.06.2006, 00:08
#16
Елпанов Евгений

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


Цитата:
Сообщение от Лентяй
Неправда ваша, ибо апельсины работают, а вот крысятина - нет. :evil: Выдает, панимаш, тройной список (((x y z))... ((a b c))), в котором каждый элемент - двойной список. Вот и верь после этого привлекательным формам! Гусары, молчать!
Посмотри в моем предыдущем посте програмку test2 - это по мотивам, которые у тебя не работают... А я только оформил в программу.
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 18.06.2006, 18:43
#17
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Всетаки я докопался до последовательностей
Их можно сделать так:

Код:
[Выделить все]
(defun num_lst_s (index2 start step / i)
(setq i (list start))
(repeat (1- index2) (setq i (append i (list (+ step (last i))))))
  )
Но только работает долго. (1..... 100 000) делала пол часа

А можно так:
и работает быстрее (1.....2 000 000) делала 33сек
Код:
[Выделить все]
(defun num_lst_s_vla (index1 index2 start  step  / a b i n sf) 
(setq a  index1)
(setq b  index2)
(vl-load-com)
(setq sf (vlax-make-safearray vlax-vbdouble (cons a b)))
(setq i 0)
(setq n (- start step))
(repeat index2 (vlax-safearray-put-element sf (setq i (1+ i)) (setq n (+ step n))))
(vlax-safearray->list sf)
)
А вот что с ними теперь делать ума не приложу. Проблемы решил уже без них.
mmax вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > В LISPе нет или не нашел?

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

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