vl-sort 에 대해..

Auto CAD/lisp|2019. 4. 4. 12:19

(vl-sort  list comparison-function)comparison-function

A comparison function. This can be any function that accepts two arguments and returns

T (or any non-nil value) if the first argument precedes the second in the sort order.

The comparison-function value can take one of the following forms:

 

  • A symbol (function name)
  • '(LAMBDA (A1 A2) ...)
  • (FUNCTION (LAMBDA (A1 A2) ...)) 

제기랄 우리나라 말이 아니니 이해가 안가는군여..그렇지만 재네들이 예제 삼은걸 가지고 감으로 해볼까요..

 

1. 숫자이거나 문자를 소트하려면 (setq lst '("a3"  "a1" "b5" "c7" "b2")) 라고 할때

    (vl-sort lst '<) ;<= 이렇게 소트 시키면 결과값은 ("a1" "a3" "b2" "b5" "c7") 이렇게 나옵니다. 무척 쉽군요..ㅎㅎ

 

2. 숫자나 문자가 아닌 심볼이라면 (setq lst '(a3  a1 b5 c7 b2)) 라고 할때

    (vl-sort lst '<) <== 이렇게 소트 시키면 결과값은 error:가 나오네요..

    그렇다면 심볼은 어떻해 처리해야 할까요? 조금 고민스러워집니다...

    그러나 리습의 장점은 안되는게 없다는거 그거 믿고 계속해보죠..ㅎㅎ

   

   추가된 리습함수의 설명서를 보면 

    (vl-symbol-name symbol) 주어진 심벌의 이름을 반환한다.  <= 이걸 이용해서

 

     (vl-sort lst

          '(lambda (x1 x2)

                (< (vl-symbol-name x1) (vl-symbol-name x2))

           )

     ) ;<= 이렇게 해보니 결과값이 (A1 A3 B2 B5 C7) 나오네요..오호 이것도 별거 아니네요..ㅎㅎ

 

    여기까지 이해되실거라 믿고 다음으로 넘어갑니다.

 

3. 숫자이거나 문자이면서 리스트내에 리스트가 여러개 있을때

   (setq lst '(("a4" "b2" "c5")("a2" "b3" "c7")("a1" "b5" "c4")("a6" "b9" "c6"))) 라고 할때 

    지금까지의 방식으론 힘들거 같네요..그렇지만 리습이란거 아시져..ㅎㅎ

 

    (vl-sort lst

         (function

                (lambda (x1 x2)(< (car x1) (car x2)))

         )

     ) ;<= 이렇게 했을때 결과값은

    (("a1" "b5" "c4") ("a2" "b3" "c7") ("a4" "b2" "c5") ("a6" "b9" "c6")) <= 원하는바대로 나왔군여..그런데 (car x1)를 쓴걸 보면

 

    3:16님 눈치빨라서 알았겠죠? 리스트내 첫번째 요소로 소트했네요..

    그렇다면 두번째 요소로 소트해볼까요?

 

   (vl-sort lst

          (function

                  (lambda (x1 x2)(< (cadr x1) (cadr x2)))

          )

     ) ;<= 두번째 요소로 소트하니

   (("a4" "b2" "c5") ("a2" "b3" "c7") ("a1" "b5" "c4") ("a6" "b9" "c6")) 또 원하는바대로 나왔네요..

    이젠 세번째 요소로 하는방법 저절로 아시겠죠? (caddr x1) 하면 될듯..

 

이제 마지막 위에 질문하신 심볼이면서 리스트내 리스트가 있는걸 소트해봐야겟군여..

설명 1 2 3을 조합하면 답이 나오는데..이왕 해본던거 끝까지 해봐야겠네요.. 막상해보니깐 별거 아니네요..ㅎㅎ

 

4. (setq lst '((a4 b2 c5)(a2 b3 c7)(a1 b5 c4)(a6 b9 c6))) 라고 할때 

    (vl-sort lst

         (function

               (lambda (x1 x2)

                     (< (vl-symbol-name (car x1))(vl-symbol-name (car x2)))

               )

          )

    ) ;<= 결과가 무지 궁금하네요..

    콘솔창에 이넘을 실행시키니  

    야호~! 3:16님의 고민타파~! ((A1 B5 C4) (A2 B3 C7) (A4 B2 C5) (A6 B9 C6)) <= 이런결과가 나오네요..

 

   1 2 3 4 의 글을 보시고 리스트 소트에 대한 모든 궁금중은 해결되었으리라 믿고 담에 달수한테 소주 한잔 쏴 주삼~! ㅎㅎㅎ

   정모도 안가는넘이 바라는거는 있어서..ㅋㅋㅋ 

   농담이구여..언제나 열심히 공부하는 모습 보기좋습니다. 고수가 되는 그날까지 계속 열공하세요~!!! 3:16님 홧팅~!!! 

 

* vl-sort 를 사용하려면 먼저 vl-load-com 선행되어야 한다는거...노파심에..ㅎㅎㅎ

 

출처 : 아키모아 행복한 하루 http://cafe.daum.net/archimore/IP9e/21

 

 

 

 

 

댓글()