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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Точечные списки в AutoLisp

Точечные списки в AutoLisp

Ответ
Поиск в этой теме
Непрочитано 23.03.2012, 15:10 #1
Точечные списки в AutoLisp
M_konst
 
Регистрация: 13.03.2009
Сообщений: 26

Доброе время суток!. Уважаемы спецы Автолиспа подскажите пож. хочу создать список типа:
Код:
[Выделить все]
 ((1 . 0) (2 . 0) (3 . 0))
Вот код которым пытаюсь осуществить это:
Код:
[Выделить все]
 
 (setq j 2)
 (setq mm '(1 . 0) kk 2)
  (repeat j
    (setq mm1 (cons (eval kk) 0))
    (setq mm (list mm mm1))
    (setq kk (1+ kk))
  )  
Прошу сильно не пинать. Просто лисп изучаю тока 3-й день.
Просмотров: 11195
 
Непрочитано 23.03.2012, 16:43
#2
gomer

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


(list (cons 1 0) (cons 2 0) (cons 3 0))
(mapcar 'cons (list 1 2 3 4) (list 0 0 0)))
(mapcar '(lambda (x) (cons x 0)) (list 1 2 3))
gomer вне форума  
 
Непрочитано 23.03.2012, 17:15
#3
Дима_

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


Ну и чтоб совсем запутать
Код:
[Выделить все]
 (defun test (x) (if (/= x 0) (cons (cons x 0) (test (1- x)))))
пример запуска (reverse (test 10))
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 23.03.2012, 23:14
#4
gomer

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


(reverse (test -10))
gomer вне форума  
 
Непрочитано 24.03.2012, 00:39
#5
Дима_

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


Цитата:
Сообщение от gomer Посмотреть сообщение
(reverse (test -10))
А так же (test nil) (test "10") (test '10) - это функция для ПРОГРАММИСТА которая предполагает "правильные" аргументы, их соответствие надо проверять при получении (вводе пользователя, чтении и.т.д), иначе программа из одних проверок состоять будет.
з.ы. Тем паче в автолиспе функцию проверяющию ВСЕ не напишешь - как минимум количество аргументов проверить не возможно - и (test) или (test 1 2) - закончится аналогичным результатом.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 24.03.2012, 01:27
#6
gomer

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


Дима_, дело не в этом, ваши примеры вызовут ошибку, и это нормально, а мой вызовет переполнение стека (Тяжелая ошибка), логически /= слишом хлипкая затычка между положительными и отрицательными числами
gomer вне форума  
 
Автор темы   Непрочитано 24.03.2012, 10:20
#7
M_konst


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


Забыл добавить что количество точечных пар в списке заранее неизвестно (т.е. перем j не постоянна). Поэтому я включил все в цикл.
M_konst вне форума  
 
Непрочитано 24.03.2012, 10:32
#8
gomer

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


Цитата:
Сообщение от M_konst Посмотреть сообщение
количество точечных пар в списке заранее неизвестно
Тогда уточните задачу и откуда берете исходные данные
gomer вне форума  
 
Автор темы   Непрочитано 27.03.2012, 11:58
#9
M_konst


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


Благодорю что откликнулись. Вопрос снят. Догадался......
Получилось вот что:
Код:
[Выделить все]
 
  (setq mm '(1 . 0) kk 2 j 3)
  (repeat j
    (setq mm1 (cons (eval kk) 0))
    (setq mm (list mm mm1))
    (setq kk (1+ kk))
  )  
M_konst вне форума  
 
Непрочитано 27.03.2012, 17:47
#10
CB

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


Цитата:
хочу создать список типа:
((1 . 0) (2 . 0) (3 . 0))

Получилось вот что:
((((1 . 0) (2 . 0)) (3 . 0)) (4 . 0))
Код:
[Выделить все]
(setq j 3)
(mapcar '(lambda (x) (cons x 0))
        ((lambda (j / lst)
           (repeat j
             (setq lst (cons j lst)
                   j   (1- j)
             ) ;_ end of setq
           ) ;_ end of repeat
           lst
         ) ;_ end of lambda
          j
        )
) ;_ end of mapcar
__________________
Никогда не спорьте с дураками - они опустят Вас до своего уровня и победят за счет опыта
CB вне форума  
 
Непрочитано 27.03.2012, 18:55
#11
gomer

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


хочется орать благим матом за такое ВНИМАТЕЛЬНО, смотрите #3
gomer вне форума  
 
Непрочитано 27.03.2012, 19:51
#12
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 813


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Ну и чтоб совсем запутать
Код:
[Выделить все]
 (defun test (x) (if (/= x 0) (cons (cons x 0) (test (1- x)))))
пример запуска (reverse (test 10))
Совет на будущее
Чтобы не добавлять костыль в виде реверса в рекурсивные
используй APPEND вместо CONS

Код:
[Выделить все]
(defun ncons (x)
  (if (not (minusp x))
    (append (ncons (1- x))(list (cons x 0)))
    )
  )
~'o'~
Олег (jr.) вне форума  
 
Непрочитано 27.03.2012, 20:10
#13
Дима_

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


Цитата:
Сообщение от Олег (jr.) Посмотреть сообщение
Чтобы не добавлять костыль в виде реверса в рекурсивные
используй APPEND вместо CONS
Спасибо за желание помочь - но Ваш совет, как бы это помягче сказать, меня немножко расстраивает. Расстраивает тем, что Вы написали не одну "программку" для "молодых" и не только формучан, опыт в этом деле у Вас есть, но ОСНОВЫ лиспа у Вас сильно хромают. Списки это НЕ массивы, сложение (append) списков a1 и a2 происходит за количество операций равное количеству элементов в a1 (которые еще надо выcarиривать из списка). И делать это в цикле, мягко говоря не рационально (Вам не приходило в голову, почему листописатели, не догадались сделать такую простую и удобную функцию, как добавление элемента в конец списка). Вобщем изучите вопрос - то что Вы предлагаете - не используйте - это не костыли, а инвалидная коляска.
з.ы.
Вот так "логически" выгядит append
Код:
[Выделить все]
 (defun my-append(a1 a2)
  (if a1
      (cons (car a1) (my-append (cdr a1) a2))
      a2))
з.з.ы. Погоняйте Ваш подход на больших списках - секундомер, чтоб увидеть разницу, не понадобится.
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 27.03.2012 в 20:25.
Дима_ вне форума  
 
Непрочитано 27.03.2012, 20:31
#14
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 813


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Спасибо за желание помочь - но Ваш совет, как бы это помягче сказать
дело хозяйское, это был только совет
полемика закрыта,
успехов

~'o'~
Олег (jr.) вне форума  
 
Непрочитано 27.03.2012, 20:34
#15
gomer

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


о чем спор, если есть assoc?
gomer вне форума  
 
Непрочитано 12.02.2019, 11:29
#16
tujn08


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


Привет!
подскажите как создать и редактировать списки вида:
Код:
[Выделить все]
 (1 . ("данные1" "данные2"))
tujn08 вне форума  
 
Непрочитано 12.02.2019, 11:43
#17
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,665


никак. у точечной пары второй аргумент не может быть списком.
koMon вне форума  
 
Непрочитано 12.02.2019, 11:53
1 | 1 #18
Кулик Алексей aka kpblc
Moderator

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


Фигню написал... Вот верное:
Код:
[Выделить все]
 (setq lst '((1 ("data1" "data2")) (2 ("data3" "data4")) (3 "data5" "data6")))
(cdr (assoc 1 lst))
(cdr (assoc 3 lst))
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 12.02.2019, 12:38
#19
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,665


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
(setq lst '((1 ("data1" "data2")) (2 ("data3" "data4")) (3 "data5" "data6")))
и в каком же месте здесь можно обнаружить точечный список (пару)? или может тема про вложенные списки?
koMon вне форума  
 
Непрочитано 12.02.2019, 12:56
#20
tujn08


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Вот верное:
точно! без точки- забыл совсем )))

----- добавлено через ~10 мин. -----
Цитата:
Сообщение от koMon Посмотреть сообщение
или может тема про вложенные списки?
цель про простой/быстрый доступ к спискам.
tujn08 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Точечные списки в AutoLisp

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Квадрантное представление окружности на AutoLISP v1talka LISP 39 29.02.2012 14:25
Литература по AutoLisp и VBA для приложений M_konst LISP 5 29.08.2009 17:32
Как отладить нейтив и менеджед код в COM объекте который используется из AutoLISP? lexluther LISP 1 12.08.2009 08:37
Параметрическая библиотека в autoLISP joisegatoi LISP 8 18.06.2007 18:39
Как из Delphi запустить программу на AutoLISP Valery LISP 1 23.09.2005 20:51