(defun c:zx ( / *error* sel val var el )
(defun *error* ( msg )
(mapcar ‘(lambda ( a b ) (if b (setvar a b))) var val)
(LM:endundo (LM:acdoc))
(if (and msg (not (wcmatch (strcase msg t) “*break,*cancel*,*exit*”)))
(princ (strcat “nError: ” msg))
)
(princ)
)
이중에서 mapcar, lambda함수를 처음봐서… 질문 드립니다…
무슨 기능을 하는 함수인가요?
그리고 (LM:endundo (LM:acdoc)) <-이 문장은 함수가 아니라 변수라고 뜨는데,
맨 윗줄에 변수선언 할 때도 지정이 안되어있는데, 이 변수는 어디에 쓰이는 변수인가요?
리습 고수님들 답변 부탁드립니다..
공유
혹시 몰라 리습 전체 올려 드립니다.
(defun c:cc ( / *error* sel val var )
(defun *error* ( msg )
(mapcar ‘(lambda ( a b ) (if b (setvar a b))) var val)
(LM:endundo (LM:acdoc))
(if (and msg (not (wcmatch (strcase msg t) “*break,*cancel*,*exit*”)))
(princ (strcat “nError: ” msg))
)
(princ)
)
(LM:startundo (LM:acdoc))
(if
(setq sel
(LM:ssget “nSelect : “
‘( “_:L”
(
(-4 . “<OR”)
(0 . “LINE”)
(-4 . “<AND”)
(0 . “LWPOLYLINE”)
(-4 . “<NOT”)
(-4 . “&=”) (70 . 1)
(-4 . “NOT>”)
(-4 . “AND>”)
(-4 . “OR>”)
)
)
)
)
(progn
(setq var ‘(cmdecho peditaccept)
val (mapcar ‘getvar var)
)
(mapcar ‘(lambda ( a b c ) (if a (setvar b c))) val var ‘(0 1))
(command “_.pedit” “_m” sel “” “_j” “” “_c” “” “”)
)
)
(*error* nil)
(princ)
)
기본 함수들이라 도음말을 보시면 대부분 알 수 있습니다.
mapcar는 리스트에 연산규칙을 적용시킨다고 이해하시면 됩니다.
예를 들어 +함수는 여러 숫자를 합하는 함수입니다.
(+ 숫자1 숫자2 숫자3)과 같은 방식 이죠
숫자를 대입하여 (+ 1 2 3)으로 해보시면 결과는 6이 나오게 됩니다
mapcar는 이러한 연산을 리스트를 대상으로 적용하는 것입니다.
(mapcar ‘+ 리스트1 리스트2 리스트3 ) 와 같은 방식이 됩니다.
숫자를 대입해 보면 (mapcar ‘+ ‘( 1 11 21 ) ‘( 2 12 22 ) ‘( 3 13 23 ) )
말하자면 (list (+ 1 2 3) (+ 11 12 13) (+ 21 22 23)) 과 같은 것이 됩니다.
정말 편리한 기능이죠.
하지만 사용을 위해서는 연산이 적용되는 범위를 정확히 인지해야 합니다.
예를 들면 1+ 와 같은 증가 함수는 하나의 숫자를 대상으로 하게되므로
(1+ 1 2 3) 이렇게 쓰면 안되고 (1+ 1) 하나의 숫자만 되므로
1+ 함수는 mapcar를 적용하면 하나의 리스트만 써야 합니다.
(mapcar ‘1+ ‘( 1 2 3 ) ) 은 (list (1+ 1) (1+ 2) (1+ 3)) 과 같은 방식이라고 보시면 됩니다.
그리고 lambda 는 사용자가 함수를 정의해서 사용하는 것입니다.
lambda 로 정의한 연산을 mapcar로 리스트에 적용한것 뿐입니다.
올리신 부분의 (mapcar ‘(lambda ( a b ) (if b (setvar a b))) var val ) 을 보시면
lambda ( a b ) 에서 a b 두 값이 필요한 것으로 정의 했고
사용법은(if b (setvar a b)) 로 b값이 존재하면 a에 b값을 세팅하는것으로 되어있으니
결국 var는 변수명 리스트이고 val은 변수값 리스트라는 것을 알 수 있습니다.