・ リスト処理 いろいろ

Jo_lst_set.lsp としてお蔵入りツールにもアップしときました

;***********************************************************************;
;リスト処理関数セット                                                   ;
;                                                2004/06/29  by Kamijo  ;
;***********************************************************************;

;***********************************************************************;
;リストの最後を除いて返す( (last)の反対 )                             ;
;***********************************************************************;
(defun Jof_lstdel_last (
			lst ;リスト;
			)
  (reverse (cdr (reverse lst)))
  )

;***********************************************************************;
;リストの要素を指定して削除                                             ;
;    削除したい要素のリストで元リストから要素を削除                     ;
;***********************************************************************;
(defun Jof_lstdel_lst (
		       lst_org ;元リスト;
		       lst_del ;削除したい要素のリスト;
		       / lst_ret)
  (foreach n lst_org (if (not (member n lst_del)) (setq lst_ret (cons n lst_ret))))
  (reverse lst_ret)
  )

;***********************************************************************;
;削除したいグループコードのリストでエンティティーデータから要素を削除   ;
;***********************************************************************;
(defun Jof_lstdel_ed (
		      ed  ;エンティティーデータのリスト;
		      lst ;削除したいグループコードのリスト;
		      / ret )
  (foreach n ed (if (not (member (car n) lst)) (setq ret (cons n ret))))
  (reverse ret)
  )

;***********************************************************************;
;リストから nil を削除                                                  ;
;***********************************************************************;
(defun Jof_lstdel_nil (
		       lst ;元リスト;
		       / lst_ret)
  (foreach n lst (if n (setq lst_ret (cons n lst_ret))))
  (reverse lst_ret)
  )

;***********************************************************************;
;リストの要素番号で指定して削除                                         ;
;***********************************************************************;
(defun Jof_lstdel_nth (
		       lst ;元リスト;
		       n
		       / lst_ret i)
  (setq i 0)
  (repeat (length lst)
    (if (/= n i) (setq lst_ret (cons (nth i lst) lst_ret)))
    (setq i (1+ i))
    )
  (reverse lst_ret)
  )

;***********************************************************************;
;リストから重複した要素を削除                                           ;
;***********************************************************************;
(defun Jof_lstdel_same (
			lst ;元リスト;
			/ lst_ret )
  (foreach n lst (if (not (member n lst_ret)) (setq lst_ret (cons n lst_ret))))
  (reverse lst_ret)
  )

;***********************************************************************;
;リストの要素を指定して要素番号を取得                                   ;
;    同じ要素が複数含まれている場合は、最初に現れる要素番号を返す       ;
;    要素がなければ nil を返す                                          ;
;***********************************************************************;
(defun Jof_lstret_nth (
		       lst ;元リスト;
		       el  ;要素;
		       / )
  (if (member el lst) (- (length lst) (length (member el lst))) nil)
  )

;***********************************************************************;
;リストのn番目からx個の要素をリストで返す                               ;
;***********************************************************************;
(defun Jof_lstmid(
		  lst ;リスト;
		  n   ;n番目から 先頭は0番目;
		  x   ;x個;
		  / len ret)
  (setq len (length lst))
  (repeat (min n len)
    (setq lst (cdr lst))
    )
  (setq len (length lst))
  (repeat (min x len)
    (setq ret (cons (car lst) ret))
    (setq lst (cdr lst))
    )
  (reverse ret)
  )

;***********************************************************************;
;リストのn番目からx個の要素を削除して返す                               ;
;***********************************************************************;
(defun Jof_lstmid_del(   
		     lst ;リスト;
		     n   ;n番目から 先頭は0番目;
		     x   ;x個;
		     / len ret)
  (setq len (length lst))
  (repeat (min n len)
    (setq ret (cons (car lst) ret))
    (setq lst (cdr lst))
    )
  (setq len (length lst))
  (repeat (min x len)
    (setq lst (cdr lst))
    )
  (setq len (length lst))
  (repeat len
    (setq ret (cons (car lst) ret))
    (setq lst (cdr lst))
    )
  (reverse ret)
  )

;***********************************************************************;
;リストをn番目より前と以後にわけて返す                                  ;
;***********************************************************************;
(defun Jof_lst_div(    
		   lst ;リスト;
		   n   ;n番目 先頭は0番目;
		   / len ret1 ret2 )
  (setq len (length lst))
  (repeat (min n len)
    (setq ret1 (cons (car lst) ret1))
    (setq lst (cdr lst))
    )
  (setq len (length lst))
  (repeat len
    (setq ret2 (cons (car lst) ret2))
    (setq lst (cdr lst))
    )
  (list (reverse ret1) (reverse ret2))
  )