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

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

Lisp. Вставка в список.

Ответ
Поиск в этой теме
Непрочитано 25.12.2010, 22:57 #1
Lisp. Вставка в список.
back1981
 
Регистрация: 23.07.2009
Сообщений: 29

Необходимо вставить в список элемент на определнную позицию, т.е. вот так

(setq lst (insert_element num element lst)), где num - позиция в списке, element - вставляемый элемент, lst - список куда вставляют, возврат искомый список. Сам то я сделал, но очень не элегантно, при помощи перебора с repeat. Есть ли что нибудь готовое? Заранее благодарен.
Просмотров: 8923
 
Непрочитано 26.12.2010, 00:09
#2
gomer

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


на заре своей юности делал... так шта мог и ошибиться...
Код:
[Выделить все]
(defun cuta (lst i)
;;; Возвращяет часть списка до i-го элемента включительно
;;; (cuta (list 1 3 4 2 5) 1)
  (while (> (length lst) (1+ i))
    (setq lst (reverse (cdr (reverse lst))))
  )
)

(defun cutb (lst i)
;;; Возвращяет часть списка от i-го элемента включительно
;;; (cutb 3 '(1 3 4 2 5))
  (if (= i 0)
    lst
    (if	(= i 1)
      (cdr lst)
      (setq ls (cutb (cdr lst) (1- i)))
    )
  )
)
(defun inserta (lst n i)
;;; (inserta 7 2 '(1 3 4 2 5))
  (append (cuta lst i) (cons n (cutb lst (1+ i))))
)

(defun insertb (lst n i)
;;; (insertb 7 2 (list 1 3 4 2 5))
  (append (cuta lst (1- i)) (cons n (cutb lst i)))
)
gomer вне форума  
 
Автор темы   Непрочитано 26.12.2010, 00:36
#3
back1981


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


Похоже на правду, спсибо
back1981 вне форума  
 
Непрочитано 26.12.2010, 03:23
#4
Дима_

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


Цитата:
Сообщение от back1981 Посмотреть сообщение
Необходимо вставить в список элемент на определнную позицию...
Уверен, что Вы пытаетесь использовать список как массив - это стандартная "мания" "приходящих в лисп". Посмотрите как решаются подобные Вышей исходной задаче - вряд-ли такую операцию встретите.
p.s. и не спроста такой "простой" операции в стандартном наборе команд нет. Чтобы писать на лиспе, надо научится понимать его логику.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 26.12.2010, 10:06
#5
gomer

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


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Чтобы писать на лиспе, надо научится понимать его логику.
Элементарный пример... вставка в list_box dcl-окна... как по другому решить эту задачу?
gomer вне форума  
 
Непрочитано 26.12.2010, 16:38
#6
VVA

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


Код:
[Выделить все]
(defun remove-i (i lst)
;;;================================================================
;;;Ф-ция удаляет i-й(начиная с 0) элемент списка
;;; i - индекс элемента
;;;lst- список
;;;================================================================
(setq i (1+ i))
(vl-remove-if '(lambda (x) (zerop (setq i (1- i)))) lst)
) ;_ end of defun

(defun Insert-i (pos item lst / tmp)
;;;================================================================
;;;Ф-ция вставляет в позицию pos (начиная с 0) элемент списка item
;;; pos - индекс (позиция) начиная с 0
;;;; item - элемент списка
;;;  lst- список
;;;_http://www.theswamp.org/index.php?topic=14226.0
;;;================================================================
       (if (< -1 pos (1+ (length lst)))
        (progn
          (repeat pos
            (setq tmp (cons (car lst) tmp)
                  lst (cdr lst)
            );_setq
          );_repeat
          (append (reverse tmp) (list item) lst)
        );_progn
        lst
      );_if
  );_defun
(defun subst-i (i itm lst)
;;;================================================================
;;;Ф-ция изменяет i-й(начиная с 0) элемент списка новым значением
;;; i - индекс элемента
;;;itm - новое значение
;;;lst - список
;;;http://www.theswamp.org/index.php?topic=14170.0
;;;================================================================
      (setq i (1+ i))
      (mapcar
        '(lambda (x)
           (if (zerop (setq i (1- i)))
             itm
             x
           ) ;_ end of if
         ) ;_ end of lambda
        lst
      ) ;_ end of mapcar
    ) ;_ end of defun
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 26.12.2010, 18:49
#7
gomer

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


Цитата:
Сообщение от VVA Посмотреть сообщение
(defun subst-i (i itm lst)
;;;================================================================
;;;Ф-ция изменяет i-й(начиная с 0) элемент списка новым значением
;;; i - индекс элемента
;;;itm - новое значение
;;;lst - список
;;;http://www.theswamp.org/index.php?topic=14170.0
;;;================================================================
(setq i (1+ i))
(mapcar
'(lambda (x)
(if (zerop (setq i (1- i)))
itm
x
) ;_ end of if
) ;_ end of lambda
lst
) ;_ end of mapcar
) ;_ end of defun
хорошее решение для списков в диалоговых окнах но для больших списков будет медленней работать ятд
аналогично с remove-i

Последний раз редактировалось gomer, 26.12.2010 в 19:00.
gomer вне форума  
 
Автор темы   Непрочитано 26.12.2010, 19:52
#8
back1981


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


Собственно говоря хочу хранить некоторую служебную иформацию в расширенных данных некоторых граф. элементов а затем ее отсортировывать по входящим в эти элементы данным. сортировку уже сделал сейчас на этапе оптимизации. вобщем все.
back1981 вне форума  
 
Непрочитано 26.12.2010, 22:40
#9
Li6-D


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


Цитата:
Сообщение от back1981 Посмотреть сообщение
Собственно говоря хочу хранить некоторую служебную иформацию в расширенных данных некоторых граф. элементов а затем ее отсортировывать по входящим в эти элементы данным. сортировку уже сделал сейчас на этапе оптимизации. вобщем все.
Для сортировки пригодятся стандартные функции vl-sort, vl-sort-i.
Первая функция в некоторых случаях может удалять дублирующие элементы.
Li6-D вне форума  
 
Непрочитано 27.12.2010, 10:01
#10
VVA

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


Цитата:
Сообщение от gomer Посмотреть сообщение
в диалоговых окнах но для больших списков будет медленней работать ятд
Медленней чем что?
В примечаниях опубликованных лиспов есть ссылка на соответствующую тему на theswamp.org. Там много хороших алгоритмов + для всех есть Benchmark'и.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 27.12.2010, 17:56
#11
back1981


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


Переделал своего сортировочного монстра посредством vl-sort-i, но главое тут в lambda функции. Получилось на порядок красивее. Поясните пожалуйста если скажем тест-функция выдаст все nil, то получиться обратный список иначе говоря все элементы выдавшие тест функции nil сдвигаются вверх?

Последний раз редактировалось back1981, 27.12.2010 в 18:02.
back1981 вне форума  
 
Непрочитано 27.12.2010, 18:08
#12
gomer

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


Цитата:
Сообщение от VVA Посмотреть сообщение
Медленней чем что?
я о том, что mapcar перебирает весь список, что в данном случае не нужно... Хотя вариант в #6 может работать быстрее #2...
самый быстрый вариант имхо, как в счетах... отсчитали нужное, удалили или вставили... отсчитали обратно... хвост списка не обрабатывается...
gomer вне форума  
 
Непрочитано 27.12.2010, 20:48
#13
Li6-D


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


Цитата:
Сообщение от back1981 Посмотреть сообщение
Переделал своего сортировочного монстра посредством vl-sort-i, но главое тут в lambda функции. Получилось на порядок красивее. Поясните пожалуйста если скажем тест-функция выдаст все nil, то получиться обратный список иначе говоря все элементы выдавшие тест функции nil сдвигаются вверх?
Список будет отсортирован так, чтобы тест-функция для двух последовательных элементов в отсортированном списке возвращала T. То есть при подстановке элементов отсортированного списка с номерами i и (1+ i) соответственно в первый и второй аргументы лямбда-функции всегда получим Т.
А чтобы получить реверсированный список, всегда можно изменить тест-функцию, чтобы она возвращала противоположный результат (> заменить на <=, = заменить на /=, применить not к последнему выполняемому выражению лямбды-функции и т.д.). Если по какой-либо причине это затруднительно, можно реверсировать полученный список.
Похоже, что vl-sort(-i) не циклится при некорректной тест-функции (например, как в известной игре камень>ножницы>бумага>камень):
(vl-sort '(0 1 2 3) '/=) возвращает (3 2 1 0);
(vl-sort '(0 1 2 3) '=) возвращает (0 1 2 3).
Последний результат сортировки не логичен с точки зрения определения vl-sort.
Li6-D вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Lisp. Вставка в список.



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
lisp помогите обработать список Apelsinov LISP 33 16.07.2021 15:56
Lisp показывает ошибку Плохо сформированный список на входе BBLainer LISP 20 27.04.2010 18:40
Lisp: Список элементов в слоях ALFMario LISP 4 29.04.2008 17:26
Помощь по Лире Серега М Лира / Лира-САПР 52 28.05.2007 02:47