본문 바로가기
AutoCAD/Lisp Subroutine

리스트 관련 서브함수

by Crony 2011. 12. 31.
;; ─────  리스트 내부의 중복되는 요소삭제
;;  (Sub_OverlapLispDel (list 0 1 3 2 2 3  1 4 5))
;;  (0 2 3 1 4 5)
(defun Sub_OverlapLispDel (InList / ExList)
    (foreach item InList
        (if (not (member item ExList))
            (setq ExList (cons item ExList))
        )
    )
    (reverse ExList)
)

;; ─────  2개의 리스트를 비교하는 중복되는 요소삭제
;;  (Sub_MinusList (list 0 1 2 3 4 5)(list 0  2 4))
;;  (1 3 5)
(defun Sub_MinusList (AList BList / ExList)
    (setq ExList nil)
    (foreach item Alist
        (if (not (member item Blist))
            (setq ExList (cons item ExList))
        )
    )
    (reverse ExList)
)
;; ─────  리스트를 구분자로 결합하여 글자 제작
;;  (Sub_List>Sting (list "AA" "11" "BB" "22" "CC" "33""DD" "44") " / ")
;;  "AA / 11 / BB / 22 / CC / 33 / DD / 44"
(defun Sub_List>Sting (LayerList ctr / LayerText)
    (setq LayerText nil)
    (foreach item LayerList
        (if (eq LayerText nil)
            (setq LayerText item)
            (setq LayerText (strcat LayerText ctr item))
        )
    )
    LayerText
)
 
;; ─────  글자를 구분자로 분리하여 리스트 제작
;;  (Sub_Sting>List "AA / 11 / BB / 22 / CC / 33 / DD / 44" " / ")
;;  ("AA" "11" "BB" "22" "CC" "33" "DD" "44")
(defun Sub_Sting>List (str ctr / sn newList)
    (while (setq sn (vl-string-search ctr str))
        (setq newList (cons (substr str 1 sn) newList))
        (setq str (substr str (+ (+ (strlen ctr) sn) 1)))
    )
    (reverse (cons str newList))
)
 
;; ─────  리스트에서를 N번째요소 교체 추가
;;  (Sub_EditList 'Chg 2 (list "A" "B" "C" "D" "A" "B") "X")
;;  ("A" "X" "C" "D" "A" "B")
;;  (Sub_EditList 'Ins 2 (list "A" "B" "C" "D" "A" "B") "X")
;;  ("A" "X" "B" "C" "D" "A" "B")
(defun Sub_EditList (Opt Num Lst Put / Rtn)
    (setq Rtn nil)
    (foreach item Lst
        (setq Num (1- Num))
        (cond
            ((not (zerop Num))(setq Rtn (cons item Rtn)))
            ((and (zerop Num)(eq Opt 'Chg))(setq Rtn (cons Put Rtn)))
            ((and (zerop Num)(eq Opt 'Ins))(setq Rtn (cons item (cons Put Rtn))))
        )
    )
    (reverse Rtn)
)
;; ─────  리스트에서를 N번째요소 삭제
;;  (Sub_RemoveNth 3 (list 0 1 2 3 4 5))
;;  (0 1 3 4 5)
(defun Sub_RemoveNth (Num InList)
    (vl-remove-if '(lambda (x) (zerop (setq Num (1- Num)))) InList)
) 

'AutoCAD > Lisp Subroutine ' 카테고리의 다른 글

two-element array of doubles 과 three-element array of doubles .  (0) 2012.08.16
삼각함수  (0) 2012.08.16