-
MAPCAR와 그 친구들(MAPC, MAPCAN)Programmer/Programming 2014. 5. 30. 16:05
MAPCAR는 리스트의 값에 동일한 작업을 처리하는데 유용하다.
MAPCAR의 인자는 적용할 함수와 한 개 이상의 리스트를 인자로 가진다. 1
인자 함수는 리스트의 개수만큼 인자를 받을 수 있어야 한다.
MAPCAR는 인자 함수의 결과를 리스트로 묶어서 반환한다.리스트의 모든 값에 10을 더해보다. (인자 함수가 한개의 인자를 가지는 것을 주목한다.)
(mapcar #'(lambda (x) (+ x 10)) (list 1 2 3)) ; => (11 12 13)
두개의 리스트의 값을 더해보다. (인자 함수가 두개의 인자를 가지는 것을 주목한다.)
(mapcar #'(lambda (x y) (+ x y)) (list 1 2 3) (list 4 5 6)) ; => (5 7 9)
MAPC, MAPCAN는 반환값(return value)이 다른 것을 제외하고는 MAPCAR와 동일하다.
MAPC는 단순히 첫번째 리스트를 반환한다.
MAPCAN은 인자 함수의 결과를 연결하여 반환한다.
(MAPCAR와 MAPC, MAPCAN의 차이점은 아래 단락에서 자세히 설명)인자 함수 결과에 MAPCAR은 LIST 함수를 MAPCAN은 APPEND 함수를 적용한다고 이해하면 된다. 2
예를 들어, 인자 함수의 결과가 각각 (a b c), (d e f), (g h i)라면,
MAPCAR은 (list '(a b c) '(d e f) '(g h i)) = ((a b c) (d e f) (g h i))를
MAPCAN의 (append '(a b c) '(d e f) '(g h i)) = (a b c d e f g h i)를 돌려준다.각각의 차이점을 예를 들어 설명하겠다.
MAPCAR는 람다 함수의 결과 (5), (6), (7)을 리스트로 묶어서 ((5) (7) (9))을 반환한다.
(mapcar #'(lambda (x y) (list (+ x y))) (list 1 2 3) (list 4 5 6)) ; => ((5) (7) (9))
MAPCAN는 람다 함수의 결과 (5), (6), (7)을 서로 연결하여 리스트 (5 7 9)을 돌려준다.
(mapcan #'(lambda (x y) (list (+ x y))) (list 1 2 3) (list 4 5 6)) ; => (5 7 9)
MAPC는 단순히 첫번째 인자 리스트 (1 2 3)을 반환한다.
(mapc #'(lambda (x y) (list (+ x y))) (list 1 2 3) (list 4 5 6)) ; => (1 2 3)
MAPC는 반환값에 관심이 없고 인자 함수의 부작용(side effects)이 중요한 경우에 사용한다.
예를 들어, 아래과 같이 결과를 화면에 출력하고 싶은 경우에 적절한다.(mapc #'(lambda (x y) (print (+ x y))) (list 1 2 3) (list 4 5 6)) ; >> 5 ; >> 7 ; >> 9 ; => (1 2 3)
'Programmer > Programming' 카테고리의 다른 글
리습의 개발 방법을 배우자: 대도 웜퍼스 게임의 설계 (0) 2014.06.20 테스트 주도 방식으로 리스프 매크로 작성하기 (0) 2014.06.05 간단한 데이타베이스를 TDD 로 개발하기 소스 코드 (0) 2014.03.19 간단한 데이타베이스를 TDD 로 개발하기 3회: add-record (0) 2014.03.19 간단한 데이타베이스를 TDD 로 개발하기 2회: make-cd (0) 2014.03.19 댓글