range와 느긋한 L.range


range 함수

⇒ 숫자하나를 받으면 그 크기만큼 배열을 반환하는 함수

const range = l => {
    let i = -1;
    let res = [];
    while (++i < l) {
        res.push(i);
    }
    return res;
};
var list = range(4);
log(list); //[0,1,2,3]
log(reduce(add, list)); // 6

느긋한 L.range

const L = {};
L.range = function *(l){
    let i = -1;
    while (++i < l) {
        yield i;
    }
};
var list = L.range(4);
log(list); //L.range {<suspended>}
log(reduce(add, list)); // 6

차이점

일반 range함수는 함수 호출시점에 이미 배열로 평가가 되서 list에 대입되었지만, 느긋한 L.range는 함수 호출시점에는 실제 값이 대입되지 않습니다.

느긋한 L.range함수는 호출 시점에서는 내부의 어떤 로직도 동작하지 않습니다. 실제 호출되는시기는 이터레이터의 내부를 순회할 때마다 하나씩 값이 평가가됩니다. 즉, list.next()를 통해 순회를 할 때 결과가 꺼내집니다.

지연평가를 어째서 사용하는가?

기존의 일반 range를 호출할 경우 즉시 배열이 생성되어 호출됩니다. 하지만, 해당 배열을 사용하는 실제 로직이 실행되기전까진 해당 배열의 필요성및 중요도는 높지 않습니다. 그 반면 지연평가는 배열을 생성하는 함수를 호출한시점에서 실제 배열을 반환하지는 않습니다. 실제로 Iterator가 순회를하며 next값을 꺼낼때 값을 생성하여 반환합니다. 이처럼 값을 실제 사용할 때까지 계산을 늦춰서 얻을 수 있는 이점은 불필요한 계산을 하지 않으므로 빠른 계산이 가능하고 무한자료 구조를 사용할수도 있습니다.