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

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

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

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

Доброго времени.
Хочу зациклить получение списка по ключу. То есть выбрал к примеру объект. Получил о нем данные в виде списка. Далее в полученном списке по ключу (вернее по паре (ключ.имя)) получил следующий объект и его данные в виде списка и так далее. Написал такую функцию. Но как то она не работает. Помогите пажалста. Первый раз ввожу 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. Причина: неверное название
Просмотров: 3427
 
Непрочитано 17.10.2012, 20:22
#2
Дима_

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


как-то так, ошибки и пр. сам лови
Код:
[Выделить все]
 (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,840


Почему никак - как, только даю гарантию - код станет для Вас еще более непонятным, либо с кривыми костылями типа Ваших трех шестерок.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 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,515


Цитата:
Сообщение от 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,840


Цитата:
Сообщение от 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,992
<phrase 1= Отправить сообщение для VVA с помощью Skype™


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

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


Код:
[Выделить все]
 (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