2017-11-28 4 views
1

계획안에 절차 신청과 계산 순서를 이해하려고합니다. 내가 map는 다음과 같은 방식으로 적용되어야 함을 알고계획안의지도 신청

(map map (list map) (list (list list)) '(((a b c)))) 

: 하나 개 이상의 목록이 주어지면

(map procedure list list ...) 

, 그때 그들은 모두 같은 길이해야 나는 다음과 같은 코드가 있습니다. 위 라인의 결과는 다음과 같습니다

(map map (list map) (list (list list)) '(((a b c)))) 
=> ((((a) (b) (c)))) 

이유는 무엇입니까? 계산 순서는 무엇입니까?

(list map) 
=> (#<Function map>)  ;list1 
(list (list list)) 
=> ((#<Function list>)) ;list2 
'(((a b c))) 
=> (((a b c)))   ;list3 

답변

3

지도의 올바른 사용은 다음과 같습니다 :

(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)로 두 번째 인수로 maplist을 평가한다. 여러분은 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의 표준 목록 라이브러리가 될 것이다.