ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Functional] 제네레이터와 이터러블
    programing/Language 2019. 7. 15. 17:37

    안녕하세요, Einere입니다.

    (ADblock을 꺼주시면 감사하겠습니다.)

     

    2019/07/15 - [programing/JavaScript] - [Functional] 순회와 이터러블


    제네레이터

    제네레이터를 이용해 만든 이터레이터

    function *gen() {
        yield 1;
        yield 2;
        yield 3;
        
        // 반환값은 {value, done}객체에서, done이 ture가 될 때의 value값이다
        // 따라서, 일반적인 순회에서 등장하지 않는 값이다
        return 100;
    }
    const iter1 = gen();
    const iter2 = gen();
    
    for(const e of iter1) console.log(e);
    // 1 2 3 출력
    
    console.log(iter2.next());
    // {value: 1, done: false} 출력
    console.log(iter2.next());
    // {value: 2, done: false} 출력
    console.log(iter2.next());
    // {value: 3, done: false} 출력
    console.log(iter2.next());
    // {value: 100, done: true} 출력
    
    console.log(iter[Symbol.iterator]() === iter);
    // true 출력

    이터레이터면서, 잘 정의된 이터레이터를 생성 및 반환하는 함수입니다.

    함수명에 *를 붙여 제네레이터임을 명시할 수 있으며, 편하게 이터레이터를 만들 수 있습니다.

    yield는 표현식이며, JS에서 표현식은 값으로 평가되므로, yield 표현식 또한 값으로 평가됩니다.

     

    응용

    // 입력받은 수부터 무한히 순회하는 이터레이터를 반환하는 제네레이터
    function *infinity(start = 0) {
        while(true) yield start++;
    }
    
    // 한계와 이터레이터를 받아, 한계까지 받은 이터레이터를 순회하는 이터레이터를 반환하는 제네레이터
    function *limit(limit, iter) {
        for(const e of iter) {
            yield e;
            
            // return을 만나면 더이상 해당 이터레이터로 순회할 수 없습니다
            if(e === limit) return;
        }
    }
    
    // 지정된 범위 내의 홀수를 순회하는 이터레이터를 반환하는 제네레이터
    function *odds(start, end) {
        for(const e of limit(end, infinity(start))) if(e % 2) yield e;
    }
    
    for(const e of odds(10, 100)) console.log(e);
    // 11 13 15 ... 99 출력
    
    console.log(...odds(5, 10));
    // 5 7 9 출력
    
    console.log([...odds(1, 10), ...odds(11, 20)]);
    // [1, 3, 5, 7, 9, 11, 13, 15, 17, 19] 출력
    
    const [start, ...end] = odds(23, 34);
    console.log(start, end);
    // 23, [25, 27, 29, 31, 33] 출력

    지정된 범위 내의 홀수를 순회하는 이터레이터를 반환하는 제네레이터를 만들었습니다.

     

     

    참고

    마이클 포거스, 『함수형 자바스크립트 : 새롭고 올바른 자바스크립트 프로그래밍 기법』, 한빛미디어(2014).

    유인동, 인프런 - 함수형 프로그래밍과 JavaScript ES6+

    댓글

Designed by black7375.