본문으로 건너뛰기
김신건의 로그

멀티 패러다임 프로그래밍 책을 읽으며 끄적이기

· 📖 약 1분 · 686자/단어

각 챕터별 인상적이거나 기억에 남기고 싶은 구문

추천의 말

  • “구조의 문제는 객체지향으로, 로직의 문제는 함수형으로” (p.6)

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

  • ArrayLike의 이터레이터에서의 reverse 구현
  • “언어를 만든 사람이 아닌, 언어의 사용자가 언어를 발전시킨 것입니다.” (p.48)

지연 평가

  • 필요한 시점까지 계산을 미루어 메모리 사용량과 연산 비용을 쥴여 향상하는 기법

generator

  • 이터레이터를 생성하는 문법적 장치로서 명령형 스타일로도 Iteration 로직을 구현할 수 있게 합니다.
  • function*, yield 키워드를 사용하여 값을 하나씩 반환함으로써 지연 평가가 필요한 로직을 간결하고 명확하게 표현할 수 있습니다.

Iteration에 대한 정리

  • Iterator: { value: T, done: boolean } 객체를 반환하는 next() 메서드를 가진 객체
  • Iterable: Iterator를 반환하는 [Symbol.iterator]() 메서드를 가진 값
  • IterableIterator: Iterator이자 Iterable인 값
  • Iteration Protocol: Iterable을 for … of 문, 전개 연산자 등과 함께 동작하도록 하는 규약

인터페이스와 클래스 상속

  • 인터페이스는 규약을 제시하여 다양한 클래스가 동일한 형식의 동작을 구현하도록 유도합니다.
  • 상속은 공통 기능을 직접 구현한 뒤, 적절히 확장하는 데 초점을 둡니다.
  • 인터페이스는 언어나 표준 라이브러리 설계 단계에서 주로 사용됩니다.
  • 상속은 주로 SDK나 애플리케이션 레벨에서 사용됩니다.

2장 - 함수형 프로그래밍과 타입 시스템 그리고 LISP

  • 아래와 같은 함수 타입 별칭을 정의할 수 있다.
type FN = (a: number, b: number) => number;

const add: FN = (a, b) => a + b;
const subtract: FN = (a, b) => a - b;

console.log(add(5, 3)); // 8
console.log(subtract(5, 3)); // 2

이터레이션 프로토콜 복습 체크리스트 내용

  • for … of 문으로 순회할 수 있는 값은 오직 Iterable입니다.
  • 전개 연산자로 배열을 만들 수 있는 값은 오직 Iterable입니다.
  • IterableIterator를 만드는 함수를 구현할 때 반환값을 { next() {...}, [Symbol.Iterator]() {...} } 형식으로 구현할 수 있으며, 이 객체는 이터레이터이자 동시에 이터러블입니다.

Map을 Generator와 Iterable 패턴으로 구현하기

function* map<A, B>(f: (a: A) => B, iterable: Iterable<A>): IterableIterator<B> {
  for (const a of iterable) {
    yield f(a);
  }
}

// 예제 1
const arr = ['1', '2', '3'];
const mapped = map(x => parseInt(x), arr);
const array2: number[] = [...mapped];
console.log(array2); // [1, 2, 3]

// 예제 2
const [head] = map(a => a.toUpperCase(), ['a', 'b', 'c']);
console.log(head); // 'A'

2.3

  • Meta Programming 이란 프로그램이 자기 자신이나 다른 프로그램을 데이터처럼 바라보며 분석, 번형, 생성하거나 실행하는 프로그래밍 기법을 의미한다.
  • LISP의 가장 큰 특징: “코드가 데이터이고, 데이터가 코드이다”라는 개념

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기