dwg.ru forum rss xml
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму |

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

Реверсивное получение списка по ключу

Версия для печати
 
Ответ
Опции темы Поиск в этой теме
Непрочитано 17.10.2012, 19:05 #1
Реверсивное получение списка по ключу
WhiteShark
 
Регистрация: 30.03.2012
Сообщений: 101

WhiteShark вне форума Вставить имя

Доброго времени.
Хочу зациклить получение списка по ключу. То есть выбрал к примеру объект. Получил о нем данные в виде списка. Далее в полученном списке по ключу (вернее по паре (ключ.имя)) получил следующий объект и его данные в виде списка и так далее. Написал такую функцию. Но как то она не работает. Помогите пажалста. Первый раз ввожу 666 в качестве ключа, чтобы попасть на выделение объекта. Во второй раз и следующие - уже интересующие ключи.


Код:
[Выделить все]
(defun alist (m)
    (setq m (getint "\nKey? "))
    (cond     ((= m 666) (cdr (assoc 1 (entget (car (entsel)) '("*")))) (setq m -1))
    (entget (cdr (assoc m (alist (m))))) (princ "\n") (princ alist))
)
Просьба переименовать тему в "Рекурсивное.."

Последний раз редактировалось WhiteShark, 17.10.2012 в 19:41. Причина: неверное название
Просмотров: 1705
 
Непрочитано 17.10.2012, 20:22
#2
Дима_

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


как-то так, ошибки и пр. сам лови
Код:
[Выделить все]
 (defun c:getkey()
((lambda (frec) (frec (entget (car (entsel)))))
 (lambda (lst)
   (princ lst)
   (frec (entget (cdr (assoc (getint "\n\n Key: ") lst)))))))
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 17.10.2012, 20:55
#3
WhiteShark


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


Отлично! Спасибо! То, что требовалось! А что без лямбды никак?
WhiteShark вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 17.10.2012, 21:06
#4
Дима_

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


Почему никак - как, только даю гарантию - код станет для Вас еще более непонятным, либо с кривыми костылями типа Ваших трех шестерок.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 17.10.2012, 23:01
#5
WhiteShark


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


Прошу прощения за глупый вопрос может быть но вот тут (frec (entget (car (entsel))) как бы идет присвоение frec? Если это правильно, то почему нет чего то типа setq? Или тут допустимо опускать его?
WhiteShark вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 18.10.2012, 01:52
#6
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,555


Цитата:
Сообщение от WhiteShark Посмотреть сообщение
вот тут (frec (entget (car (entsel))) как бы идет присвоение frec?
ни какое тут не присваивание
Код:
[Выделить все]
 (defun c:getkey ( / key lst)
  (princ (setq lst (entget (car (entsel))))) 
  (while (setq key (getint "\n\n Key: "))
    (princ (setq lst (entget (cdr (assoc key lst)))))))
вот настоящее присваивание, ка видно по количеству кода, разница не большая, зато по понятности итерация намного впереди =)
gomer вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 18.10.2012, 09:28
#7
Дима_

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


Цитата:
Сообщение от gomer Посмотреть сообщение
зато по понятности итерация намного впереди =)
Да вся эта "непонятность" из-за того что "в школе на программировании" только как а=а+1 объяснили, вся прелесть в том, что если ( ... / x y z ...) будет хотя-бы с десяток, то вся функция перед тем так появится "от и до" будет 3 раза в vlide переписанна - я с удовольствием посмотрел-бы на того, кто готов с лекгостью такой сложности функцию (не знакомую, либо подобную вчера написанной, естественно), на "понятном" императиве с первого раза выдать.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 18.10.2012, 18:13
#8
WhiteShark


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


Дима_, код от gomer, мне понятен. Но вот ваш просто ломает мой мозг ) По крайней мере рушит понимание лямбда вызовов и функций. А так же я не понимаю, каким образом оно все таки циклится? Не могли бы немного прокомментировать хотя бы первую строку?
Вот это - это вызов без передачи аргументов или нет?
((lambda (frec) (frec (entget (car (entsel))))) И в выделенном месте frec это функция от того что вернет (entget (car (entsel))) ?

Ну и все таки в соответствии с идеей о рекурсии есть какая то реализация? Моя идея была такова: функция alist всегда возвращает список, а единственное, что меняется это параметр по которому происходит поиск (ключ). Вот я и попробовал сделать так. Чувствую, что коряво и можно как то элегантней, но я только учусь и не знаю как. Лиспа к сожалению в школе не проходил. В чем у меня ошибка не могли бы тоже подсказать?
WhiteShark вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 18.10.2012, 20:26
#9
VVA

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


WhiteShark, Почитай Уроки создания рекурсивных функций от Евгения Елпанова
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 18.10.2012, 20:44
#10
Дима_

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


Код:
[Выделить все]
 (defun c:getkey() ;объявление функции getkey
((lambda (frec) ; определяем имя функции
   (frec (entget (car (entsel))))); применяем свежеопределенную функцию к DXF списку от выбранного примитива
 (lambda (lst); создаем функцю (которую мы во второй строке определяем как frec) от 1 аргумента
   (princ lst); распечатываем этот аргумент
   (frec (entget (cdr (assoc (getint "\n\n Key: ") lst)))))));рекурсивно запускаем сами себя от dxf списка
   ;полученного по запрошенному ключу
Цитата:
По крайней мере рушит понимание лямбда вызовов и функций.
Боюсь у Вас с этим знанием было не все так хорошо.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума вставить имя Обратить внимание модератора на это сообщение  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Реверсивное получение списка по ключу

РЕВЕРС. Автоматическая пакетная печать множества рамок (форматов) из пространства модели и листов
Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

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

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
DwgRuLispLib: получение списка файлов по маске с необязательной проверкой вложенных Кулик Алексей aka kpblc Библиотека функций 27 25.04.2012 20:52
Получение списка координат всех возможных прямоугольников из массива точек. swkx Программирование 6 22.04.2011 21:31
Lisp: Обработка объектов и получение списка свойств (координаты точек) Nanotronic LISP 2 23.04.2009 23:07
получение списка xref первого уровня Мансур Программирование 1 03.03.2006 20:18

|| Главная || Каталог САПР || Тендеры || Публикации || Объявления || Биржа труда || Download || Галерея ||
|| Библиотека || Кунсткамера || Каталог предприятий || Контакты || Файлообменник || Блоги ||