지도의 올바른 사용은 다음과 같습니다 :
(map proc-of-n-arity list1 ... listn)
따라서 당신이 하나 개의 목록이 있으면 시저는 하나 개의 인수를 취해야한다 나는 분명히 내가 여기서 뭔가를 놓치고, 선을 침입하려고 . 평가 순서가 정의되어 있지 않으므로 (프로시 듀어로 평가) 평가 전에 listn
의식이 올 수 있습니다. 부작용이있는 인수를 사용하여이를 테스트 할 수 있으며 일반적으로 오른쪽 또는 오른쪽에서 왼쪽으로 왼쪽에 있음을 볼 수 있습니다.
중첩 된 표현식은 마치 map
이 적용되기 전에 평가되기 때문에 고유 한 표현식을 가진 복잡한 프로 시저 호출이었습니다. 따라서 우리는 이것이 깊이 우선 평가라는 것을 알지 못하는 순서라도 평가되기 전에 평가되어야하기 때문에 평가됩니다. 그래서 다시 이상한 식에
:
(map map (list map) (list (list list)) '(((a b c))))
여기 map
는 프로 시저로 평가합니다. map
을 첫 번째 인수에 대한 프로 시저로 평가하고 나머지 식을 계산하여 (#<map>)
((#<list>))
및 물론 (((a b c)))
인 모든 요소 목록을 얻습니다. 따라서 당신은 다시의 결과로 하나 개의 요소 목록을 기대한다 :
이
(map map (list list) '((a b c)))
이 (#<list>)
및 ((a b c))
같은 절차 및 목록 등 모두 map
을 평가합니다. 그것은 하나 개의 요소리스트이기 때문에 하나 다시의 결과로 하나 개의 요소 목록을 기대 :
이
(map list '(a b c))
이 절차와 (a b c)
로 두 번째 인수로 map
및 list
을 평가한다. 여러분은 3 원소로 구성된 목록을 list
의 결과와 함께 얻을 것입니다. ((a) (b) (c))
이 하나 개의 요소는 우리가 map
가 (((a) (b) (c)))
처럼 그것으로 목록을 만들 것입니다 알고 map
응용 프로그램이 있다는 사실에 다시 가서 그것도 목록에 따라서로 얻는 외부 map
의 한 요소입니다 ((((a) (b) (c))))
이 최종 결과입니다.
이 결과가 훨씬 더 쉽게 할 수 있다는 것을 알고 : 같은 길이의 목록에 대한 제한이 R5RS 및 R6RS 만에
map
에 대한 사실이라고
(list (list (map list (caar '(((a b c)))))))
목록 인수 길이
주 SRFI- 1이 가장 짧은 목록에서 멈 춥니 다. 예 :
#!r6rs
(import (except (rnrs base) map)
(only (srfi :1) map circular-list))
(map + '(1 2 3) (circular-list 2)) ; ==> (3 4 5)
SRFI-1 대형 R7RS의 표준 목록 라이브러리가 될 것이다.