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

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

Добавление элемента в список, не понимаю.

Ответ
Поиск в этой теме
Непрочитано 24.02.2010, 18:34 #1
Добавление элемента в список, не понимаю.
baaba
 
архитектор
 
Москва
Регистрация: 07.07.2007
Сообщений: 665

Вот, бьюсь над задачкой который день, видимо неправильно бьюсь, я что то не понимаю..

Cоставляю выражение, которое выдаёт мне список значений (например 7 точек, см. ниже):

(defun wcount (n / tot)
(setq tot 0)
(while (< tot n)
(progn
(setq tot (1+ tot))
(princ (setvar "LASTPOINT" (polar (getvar "LASTPOINT") 0 25))))))

Получившийся список хочу записать в переменную:

(setq a wcount 7)

Проверяю значение переменной !a, записывается только последний элемент списка.
Просмотров: 3506
 
Непрочитано 24.02.2010, 19:44
#2
Serg_TIT

инженер-конструктор КМД
 
Регистрация: 26.09.2009
Ростовская обл.
Сообщений: 90


Вам нужен список? Почему не записать (setq a list (wcount 7))?
Serg_TIT вне форума  
 
Непрочитано 24.02.2010, 19:54
#3
VVA

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


Код:
[Выделить все]
(defun wcount (n / tot ptlist)
(setq tot 0)
(while (<= (setq tot (1+ tot)) n)
 (setq ptlist (cons (polar (getvar "LASTPOINT") 0 (* tot 25)) ptlist))
  )
  (reverse ptlist)
  )
;;;Использование
(setq a (wcount 7))
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 24.02.2010, 23:00
#4
Дима_

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


Если хотите понять лисп, надо побыстрей забыть про циклы, дополнительные переменные (ну по крайней мере постараться) индексы и пр. В "классике" лиспа сиё должно выглядеть так:
Код:
[Выделить все]
(defun wcount (n)
(if (not(= n 0)) (cons (polar (getvar "lastpoint") 0 (* n 25)) (wcount (1- n))))
)
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 25.02.2010, 09:24
#5
Do$

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


... и помнить, что количество циклов не ограничено, в отличие от количества вложенных вызовов - рекурсий.
Do$ вне форума  
 
Непрочитано 25.02.2010, 09:31
#6
Кулик Алексей aka kpblc
Moderator

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


А вот с этого момента поподробнее, пожалуйста...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 25.02.2010, 09:36
#7
Do$

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


Вот:
http://forum.dwg.ru/showpost.php?p=465695&postcount=50
Do$ вне форума  
 
Непрочитано 25.02.2010, 10:58
#8
Дима_

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


Есть такой косячок у автолиспа - в нормальных реализациях лиспа память на рекурсию выделяеться динамически, а не пихаеться в стек (по определению ограниченнный), то есть если хватает памяти на "содержание" списка, то и на его "саморекурсию" хватит:
а в автолиспе по факту
Код:
[Выделить все]
(defun wcount1 (n / lst)
(while (> n 0) (setq lst (cons (polar (getvar "lastpoint") 0 (* n 25)) lst) n (1- n)))
lst
)
делает сколько угодно (для примера 1млн - даже не "поморщился"), а рекурсивно на 20 тыс - сдыхает
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 26.02.2010, 15:20
#9
baaba

архитектор
 
Регистрация: 07.07.2007
Москва
Сообщений: 665
<phrase 1= Отправить сообщение для baaba с помощью Skype™


Огромнейшее спасибо за предложенные примеры! Задачу удалось решить, и материал для размышлений есть.
baaba вне форума  
 
Непрочитано 26.02.2010, 16:42
#10
Елпанов Евгений

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


еще три варианта:
Код:
[Выделить все]
(defun wcount1 (n / p)
 (setq p (list (mapcar '+ (getvar "lastpoint") '(25 0 0))))
 (repeat (1- n) (setq p (cons (mapcar '+ (car p) '(25 0 0)) p)))
 p
) ;_  defun
(defun wcount2 (n / l)
 (setq p (getvar "lastpoint")
       p (cons (+ (car p) 25) (cdr p))
 ) ;_  setq
 (repeat n
  (setq l (cons p l)
        p (cons (+ (car p) 25) (cdr p))
  ) ;_  setq
 ) ;_  repeat
 l
) ;_  defun
(defun wcount3 (n)
 (if (> n 0)
  (cons (mapcar '+ (getvar "lastpoint") (list (* n 25) 0 0)) (wcount3 (1- n)))
 ) ;_  if
) ;_  defun
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Добавление элемента в список, не понимаю.

Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
SCAD Office 11.1 Новые возможности EUDGEN SCAD 632 20.02.2013 17:13
Как передать функции (getkword) Список ключевых слов из списка? Kostinok Программирование 31 31.05.2012 13:08
Как вывести список всех подпримитивов блока или др. элемента. Neo_ Программирование 16 25.01.2010 19:53
Помощь по Лире Серега М Лира / Лира-САПР 52 28.05.2007 02:47
чтение данных из файла Александер Программирование 6 08.09.2005 10:24