수색…


개요

하나 이상의 목록 요소에 함수를 적용하기 위해 High-level 매핑 함수 세트를 Common Lisp에서 사용할 수 있습니다. 함수가 목록에 적용되는 방식과 최종 결과가 어떻게 얻어지는 지에 차이가 있습니다. 다음 표는 차이점을 요약하고 각각에 대해 등가의 LOOP 양식을 보여줍니다. f 는 적용 할 함수이며,리스트의 수와 같은 수의 인수를 가져야합니다. "자동차에 적용됨"은 목록의 요소에 차례로 적용된다는 것을 의미하며 "cdr에 적용됨"은 목록, 해당 cdr 및 cddr 등에 차례로 적용됨을 의미합니다. "결과"열은 전역 결과가 결과를 나열하고이를 연결하여 (목록이어야하므로!), 단순히 부작용에 사용 된 경우를 보여줍니다 (이 경우 첫 번째 목록이 반환됩니다).

기능 적용 대상 보고 등가 LOOP
(FL mapcar 등등 1 ... L 않음) 결과 목록 (L, X의 n에 대한 L 1 X 1 루프 ... N (FX 수집 1 ... × n)도)
(FL maplist 1 ... L 않음) CDR 결과 목록 (L에 X n에 대한 L 1 X 1 ... N 수집 루프 (FX 1 ... × n)도)
(FL mapcan 1 ... L 않음) 결과의 연결 (L N nconc (FX 1 X n에 대한 L 1 X 1 루프 ... × n)도)
(FL mapcon 1 ... L 않음) CDR 결과의 연결 (L N nconc (FX 1 X n에 대한 L 1 X 1 루프 ... × n)도)
(FL MAPC 1 ... L 않음) l 1 (L, X의 n에 대한 L 1 X 1 ... N 반복 수행 (FX 1 ... X 않음) 마지막 (리턴 L 1))
(MAPL FL 1 ... L 않음) CDR l 1 (l 1 에서 x 1 에 대한 루프 ... l n 에서 x n 에 대해 (fx 1 ... x n ) finally (return l 1 ))

모든 경우 목록의 길이가 다를 수 있으며 가장 짧은 목록이 종료되면 응용 프로그램이 종료됩니다.

:지도 기능의 또 다른 몇 가지 가능한 map 유사한 서열 (캐릭터, 그림,리스트)에 적용 할 수있는, mapcar , 그 첫 번째 인수로서 지정된 시퀀스의 임의의 유형을 리턴 할 수 map-into 에 유사한 map 함수의 적용 결과를 유지하기 위해 첫 번째 시퀀스 인수를 파괴적으로 수정합니다.

MAPCAR의 예

MAPCAR은 가족 중 가장 많이 사용되는 기능입니다.

CL-USER> (mapcar #'1+ '(1 2 3))
(2 3 4)
CL-USER> (mapcar #'cons '(1 2 3) '(a b c))
((1 . A) (2 . B) (3 . C))
CL-USER> (mapcar (lambda (x y z) (+ (* x y) z)) 
                 '(1 2 3) 
                 '(10 20 30) 
                 '(100 200 300))
(110 240 390)
CL-USER> (let ((list '(a b c d e f g h i))) ; randomize this list
           (mapcar #'cdr
                   (sort (mapcar (lambda (x)
                                   (cons (random 100) x))
                                 list)
                         #'<=
                         :key #'car)))
(I D A G B H E C F)

mapcar 관용적으로 사용하는 것은 목록 목록으로 표시된 행렬을 조 변경하는 것입니다.

CL-USER> (defun transpose (list-of-lists)
           (apply #'mapcar #'list list-of-lists))
ROTATE
CL-USER> (transpose '((a b c) (d e f) (g h i)))
((A D G) (B E H) (C F I))

;  +---+---+---+               +---+---+---+
;  | A | B | C |               | A | D | G |
;  +---+---+---+               +---+---+---+
;  | D | E | F |    becomes    | B | E | H |
;  +---+---+---+               +---+---+---+
;  | G | H | I |               | C | F | I |
;  +---+---+---+               +---+---+---+

설명은 이 답변을 참조하십시오.

MAPLIST의 예

CL-USER> (maplist (lambda (list) (cons 0 list)) '(1 2 3 4))
((0 1 2 3 4) (0 2 3 4) (0 3 4) (0 4))
CL-USER> (maplist #'append
                  '(a b c d -)
                  '(1 2 3))
((A B C D - 1 2 3) (B C D - 2 3) (C D - 3))

MAPCAN 및 MAPCON의 예

MAPCAN :

CL-USER> (mapcan #'reverse '((1 2 3) (a b c) (100 200 300)))
(3 2 1 C B A 300 200 100)
CL-USER> (defun from-to (min max)
           (loop for i from min to max collect i))
FROM-TO
CL-USER> (from-to 1 5)
(1 2 3 4 5)
CL-USER> (mapcan #'from-to '(1 2 3) '(5 5 5))
(1 2 3 4 5 2 3 4 5 3 4 5)

MAPCAN의 용도 중 하나는 NIL 값없이 결과 목록을 만드는 것입니다.

CL-USER> (let ((l1 '(10 20 40)))
           (mapcan (lambda (x)
                     (if (member x l1)
                         (list x)
                       nil))
                   '(2 4 6 8 10 12 14 16 18 20
                     18 16 14 12 10 8 6 4 2)))
(10 20 10)

MAPCON :

CL-USER> (mapcon #'copy-list '(1 2 3))
(1 2 3 2 3 3)
CL-USER> (mapcon (lambda (l1 l2) (list (length l1) (length l2))) '(a b c d) '(d e f))
(4 3 3 2 2 1)

MAPC 및 MAPL의 예

MAPC :

CL-USER> (mapc (lambda (x) (print (* x x))) '(1 2 3 4))

1 
4 
9 
16 
(1 2 3 4)
CL-USER> (let ((sum 0))
           (mapc (lambda (x y) (incf sum (* x y)))
                 '(1 2 3)
                 '(100 200 300))
           sum)
1400  ; => (1 x 100) + (2 x 200) + (3 x 300)

MAPL :

CL-USER> (mapl (lambda (list) (print (reduce #'+ list))) '(1 2 3 4 5))

15 
14 
12 
9 
5 
(1 2 3 4 5)


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow