멀티 패러다임 프로그래밍 책을 읽으며 끄적이기
· 📖 약 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의 가장 큰 특징: “코드가 데이터이고, 데이터가 코드이다”라는 개념
💬 댓글