Fact
- 7일차!
Feelings
- 피곤하다 ㅠㅠ
Findings
tokenizer 역할과 책임
- 문자열이 들어오면 의미 있는 단위로 쪼개서 반환을 해준다.
const input = "[123, 45, 'hello']"
const output = tokenizer(input); // [[ '123', '45', 'hello' ]]
lexer 역할과 책임
- tokenizer로 얻은 유의미한 값에다가 의미를 부여한다.
const tokens = [[ '123', '45', 'hello' ]];
const lexer = lexerize(tokens);
// [[{type: 'number', value: 123},
//{type: 'number', value: 45},
//{type: 'string', value: 'hello'}]]
parser 역할과 책임
- lexer로 얻은 값을 원하는 형태로 바꾸는 작업.
const lexer = [[{type: 'number', value: 123},
{type: 'number', value: 45},
{type: 'string', value: 'hello'}]];
const parsed = parser(lexer);
//{ type: 'array',
// child:
// [ { type: 'number', value: 123, child: [] },
// { type: 'number', value: 45, child: [] },
// { type: 'string', value: 'hello', child: [] }
//]
//}
무한 구조의 재귀 함수 장 단점
-
장점
- 가독성이 좋다. 표현이 자연스러울 때가 있다
- 변수 사용이 줄어든다.(mutable state를 줄인다)
- 이로 인하여 오류가 생길 확률이 줄어든다. side-effect 발생할 확률이 줄어든다.
- 짜기 쉽다
- 코드가 간결해진다
-
단점
- 반복문 보다 느리다
- stack 이란 메모리 구조를 쓴다
-
자기 자신을 부르면서 그것들을 stack에 계속 쌓게 된다. 그래서 성능/메모리적으로 좋지 않다
- 순서대로 쌓은 스택들을 하나씩 처리할 때 문맥 변경이 일어나면서 반복문 보다 수행 시간이 걸리게 된다.
- stack의 크기가 한정되어 있어서 크기를 벗어나면 강제 종료된다.
프로그램 입력값이나 에러 처리를 위한 다양한 흐름 제어 방식
- try … catch…로 에러가 발생하더라도 흐름을 끊지 않는다. 스크립트가 끊기지 않고 계속 실행된다.
- try 안에서 에러가 발생하면 catch 블록 안에 있는 게 실행된다. 그게 아니라면 catch는 건너 띄가 된다.
try {
if(true) {
//do something
}
throw new Error("error!!")
} catch (err) {
console.log(err)
}
Future Action
- 뭐가 맞는지 헷갈릴 때가 많다. 급하게 실행하지 말고 고민을 조금 더 해보고 실행하자.