Давеча переклинило мозг на простой задаче - поменять местами два элемента в списке. В массиве это достаточно легко делается... В "нормальных языках". Но не в списке ЛИСПа. Особенно, если элемент - тоже список. А если это AutoLisp (то бишь встроенный в автокад несколько урезанный вариант)...
В общем, нашел на просторах инета. Мож кому пригодится.
Функция удаляющая элемент списка по номеру
Код:
|
;-------------------------------------------------------------------------------
; Delete_nth - Deletes the nth item from a list.
; Arguments: 2
; Num# = Nth number in list to delete
; OldList@ = List to delete the nth item
; Returns: A list with the nth item deleted.
;-------------------------------------------------------------------------------
(defun Delete_nth (Num# OldList@ / Cnt# Item NewList@)
(if (and (= (type Num#) 'int)(= (type OldList@) 'list))
(progn
(setq Cnt# 0)
(foreach Item OldList@
(if (/= Cnt# Num#)
(if NewList@
(setq NewList@ (append NewList@ (list Item)))
(setq NewList@ (list Item))
);if
);if
(setq Cnt# (1+ Cnt#))
);foreach
);progn
(setq NewList@ OldList@)
);if
NewList@
);defun Delete_nth |
Функция вставляющая элемент в список
Код:
|
;-------------------------------------------------------------------------------
; Insert_nth - Inserts a new item value into the nth number in list.
; Arguments: 3
; Num# = Nth number in list to insert item value
; Value = Item value to insert
; OldList@ = List to insert item value
; Returns: A list with the new item value inserted.
;-------------------------------------------------------------------------------
(defun Insert_nth (Num# Value OldList@ / Cnt# Item NewList@)
(if (and (= (type Num#) 'int)(= (type OldList@) 'list))
(progn
(setq Cnt# 0)
(foreach Item OldList@
(if (= Cnt# Num#)
(progn
(if NewList@
(setq NewList@ (append NewList@ (list Value)))
(setq NewList@ (list Value))
);if
(if NewList@
(setq NewList@ (append NewList@ (list Item)))
(setq NewList@ (list Item))
);if
);progn
(if NewList@
(setq NewList@ (append NewList@ (list Item)))
(setq NewList@ (list Item))
);if
);if
(setq Cnt# (1+ Cnt#))
);foreach
(if (›= Num# (length OldList@))
(if NewList@
(setq NewList@ (append NewList@ (list Value)))
(setq NewList@ (list Value))
);if
);if
);progn
(setq NewList@ OldList@)
);if
NewList@
);defun Insert_nth |
Функция меняющая два элемента списка местами
Код:
|
;-------------------------------------------------------------------------------
; Switch_nth - Switches the nth Num1# and Num2# item values in a list.
; Arguments: 3
; Num1# = nth number in list to switch with nth Num2#
; Num2# = nth number in list to switch with nth Num1#
; OldList@ = List to switch item values
; Returns: A list with two item values switched.
;-------------------------------------------------------------------------------
(defun Switch_nth (Num1# Num2# OldList@ / Cnt# Item NewList@ NewValue Valid)
(if (and (= (type Num1#) 'int)(= (type Num2#) 'int)(= (type OldList@) 'list))
(setq Valid t)
);if
(if (and Valid (‹ Num1# (length OldList@))(‹ Num2# (length OldList@))
(/= Num1# Num2#)
);and
(progn
(setq Cnt# 0)
(foreach Item OldList@
(cond
((= Cnt# Num1#)(setq NewValue (nth Num2# OldList@)))
((= Cnt# Num2#)(setq NewValue (nth Num1# OldList@)))
(t (setq NewValue Item))
);cond
(if NewList@
(setq NewList@ (append NewList@ (list NewValue)))
(setq NewList@ (list NewValue))
);if
(setq Cnt# (1+ Cnt#))
);foreach
);progn
(setq NewList@ OldList@)
);if
NewList@
);defun Switch_nth |