Skip to content

멀티패러다임이 현대 언어를 확장하는 방법

Published: at 오전 03:38

Table of contents

Open Table of contents

1.1 객체지향 디자인 패턴의 반복자 패던과 일급 함수

1.1.1 GoF의 반복자 패턴

1.1.2 지연 평가되는 map 함수

1.2 명령형 프로그래밍으로 이터레이터를 만드는 제너레이터 함수

1.2.1 제너레이터 기본 문법

yield* 키워드는 제너레이터 함수 안에서 이터러블을 순회하며 해당 이터러블이 제공하는 요소들을 순차적으로 반환하도록 해줌

1.3 자바스크립트에서 반복자 패턴 사례: 이터레이션 프로토콜

1.3.1 이터레이터와 이터러블

1.4 이터러블을 다루는 함수형 프로그래밍

1.4.1 forEach

function forEach<T>(f: (a: T) => void, iterable: Iterable<T>) {
  for (const a of iterable) {
    f(a);
  }
}

forEach(console.log, naturals(3));

map

function map<T, U>(f: (a: T) => U, iterable: Iterable<T>): IterableIterator<U> {
  function* iterator() {
    for (const a of iterable) {
      yield f(a);
    }
  }
  return iterator();
}

forEach(
  console.log,
  map(x => x * x, naturals(3))
);

filter

function filter<T>(
  predicate: (a: T) => boolean,
  iterable: Iterable<T>
): IterableIterator<T> {
  function* iterator() {
    for (const a of iterable) {
      if (predicate(a)) yield a;
    }
  }
  return iterator();
}

forEach(
  console.log,
  filter(x => x % 2 === 0, naturals(10))
);

1.5 이터러블 프로토콜이 상속이 아닌 인터페이스로 설계된 이유