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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Применение lambda в тест-функциях VL-SORT и т.п.

Применение lambda в тест-функциях VL-SORT и т.п.

Ответ
Поиск в этой теме
Непрочитано 02.06.2010, 10:25 #1
Применение lambda в тест-функциях VL-SORT и т.п.
swkx
 
Регистрация: 22.01.2010
Сообщений: 311

День добрый.

Евгений А. предоставил пример сортировки списка, в котором элементы расположены в порядке возрастания координаты Z.

Код:
[Выделить все]
(setq tab2 (VL-sort table (FUNCTION (lambda (str1 str2 /) (< (cadddr str1) (cadddr str2))))))
где table - список вида ((N1 x1 y1 z1) (N2 x2 y2 z2)...)

Объясните плиз, какая связь между аргументами str1, str2 и элементами списка.
Как выглядела бы подобная функция, если бы потребовалось добавить условие: точки с одинаковой коорд. Z должны располагаться в порядке убывания коорд. X ?
Просмотров: 3741
 
Непрочитано 02.06.2010, 10:56
#2
Дима_

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


Цитата:
Сообщение от swkx Посмотреть сообщение
Объясните плиз, какая связь между аргументами str1, str2 и элементами списка.
Берет поочередно элементы списка и при выполнении условия заданного лямбда функцией функцией возращает их в прямом или обратном порядке.
Цитата:
Сообщение от swkx Посмотреть сообщение
Как выглядела бы подобная функция, если бы потребовалось добавить условие: точки с одинаковой коорд. Z должны располагаться в порядке убывания коорд. X ?
1. написать функцию которая вначале сравнивает не равны-ли аргументы, если да то смотрит сравнивает координаты x, если нет, то как и в предыдущем посте z.
2. Вначале отсортировать по x (аналогичной функцией), потом по z.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 02.06.2010, 11:01
#3
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


str1 и str2 - это два рядом стоящих члена получаемого списка, для которых функция проверки должна выдавать T.
Цитата:
Сообщение от swkx Посмотреть сообщение
Как выглядела бы подобная функция, если бы потребовалось добавить условие: точки с одинаковой коорд. Z должны располагаться в порядке убывания коорд. X ?
Примеры списков приведи - то что есть и то что надо получить.
Do$ вне форума  
 
Непрочитано 02.06.2010, 11:09
#4
Дима_

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


см. пост 2:
Код:
[Выделить все]
(setq lst '((1 2 3) (4 5 6) (7 8 9) (3 2 1) (6 5 4) (9 8 7) (3 3 3) (4 4 4) (5 5 5) (6 6 6)))
; 1 вариант
(vl-sort 
         (vl-sort
                   lst
                      '(lambda (a b) (> (car a) (car b))))
        '(lambda (a b) (> (caddr a) (caddr b))))
; 2 вариант (теоретически должен работать быстрее т.к. меньше "прогонов")
(vl-sort
          lst
         '(lambda (a b)
         (if (= (caddr a) (caddr b))
            (> (car a) (car b))
            (> (caddr a) (caddr b)))))
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 02.06.2010, 11:36
#5
swkx


 
Регистрация: 22.01.2010
Сообщений: 311


Дошло наполовину.

Я правильно понимаю, что у LAMBDA должно быть всегда два аргумента при использовании с VL-SORT и всегда один аргумент при использовании с VL-MEMBER-IF ?
Причем во 2-м случае аргумент - элемент исходного списка ?
swkx вне форума  
 
Непрочитано 02.06.2010, 11:46
#6
VVA

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


Код:
[Выделить все]
;;;Результат (("1" 2 2 2) ("2" 0 2 3) ("3" 1 2 3) ("4" 3 2 3))  
(setq lst '(("3" 1 2 3)("2" 0 2 3)("1" 2 2 2)("4" 3 2 3)))
(vl-sort lst
  '(lambda(x y)
     (or                        ;_Или
       (< (cadddr x)(cadddr y)) ;_Z 1-го элемента меньше Z 2-го элемента
        (and                   ;_Или И
          (equal (cadddr x)(cadddr y) 1e-6) ;_Z 1-го элемента равно Z 2-го элемента
          (< (cadr x)(cadr y))              ;_X 1-го элемента меньше X 2-го элемента
          ))) )
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 02.06.2010 в 11:56.
VVA вне форума  
 
Непрочитано 02.06.2010, 11:52
#7
Дима_

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


То VVА - тоже вначале хотел про логику заикнуться - но боюсь запутать основательно.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 02.06.2010, 11:55
#8
VVA

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


Дима_,
К посту #4. Мне кажется вариант 1 будет не всегда корректно сортировать, так как вызываются 2 различные сортировки
В варианте 2 нельзя сравнивать вещественные числа с помощью функции =, только equal с допуском
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 02.06.2010, 11:56
#9
swkx


 
Регистрация: 22.01.2010
Сообщений: 311


Я так и не услышал ответ на вопрос, который задал в посте #5
swkx вне форума  
 
Непрочитано 02.06.2010, 12:55
#10
VVA

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


Цитата:
Сообщение от swkx Посмотреть сообщение
Я правильно понимаю, что у LAMBDA должно быть всегда два аргумента при использовании с VL-SORT и всегда один аргумент при использовании с VL-MEMBER-IF ?
Да. Но можно проверить все это экспериментально

Цитата:
Сообщение от swkx Посмотреть сообщение
Причем во 2-м случае аргумент - элемент исходного списка ?
В первом случае тоже
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 02.06.2010, 13:28
#11
swkx


 
Регистрация: 22.01.2010
Сообщений: 311


VVA,

вы правы, вариант 1 поста #4 не работает
Цитата:
Сообщение от VVA Посмотреть сообщение
Да. Но можно проверить все это экспериментально
Я проверил, мало того, в программе тоже всё работает, но хотелось бы ещё и понять, как именно ОНО работает
swkx вне форума  
 
Непрочитано 02.06.2010, 17:19
#12
Дима_

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


О да - с первым это я загнул - хотел попроще показать - в итоге ошибку "ляпнул".
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 06.06.2010, 12:30
#13
swkx


 
Регистрация: 22.01.2010
Сообщений: 311


Конструкции
(function (lambda....))
и
'(lambda....)
полностью идентичны во всех случаях ?
swkx вне форума  
 
Непрочитано 06.06.2010, 12:35
#14
Кулик Алексей aka kpblc
Moderator

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


http://autolisp.ru/2009/09/13/quote-...on-difference/ ?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 06.06.2010, 12:42
#15
swkx


 
Регистрация: 22.01.2010
Сообщений: 311


Ок, понято.
swkx вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Применение lambda в тест-функциях VL-SORT и т.п.



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Печать из модели по выбору объекта zenon Программирование 192 04.05.2017 09:41
Как автоматизировать печать чертежа? Serge_BN Программирование 13 04.03.2010 14:34
Внутренний радиус командой fillet Positron AutoCAD 22 03.02.2010 14:02
(GRREAD) и привязка Ева Программирование 17 18.12.2009 09:10
Копирование данных для спецификаций из выносок СПДС в таблицу из мтекстов Red Nova Программирование 177 08.12.2008 11:35