자택경비대

Yarn 으로 파일 시스템 상의 패키지 설치하는법

Programming

npm과는 다르게 yarn에서는 로컬 파일 시스템의 패키지를 설치 할경우

npm install -g . # 현재 디렉토리의 패키지를 전역 설치

처럼 파일 경로를 명시하는 방식으로 설치하게 되면 오류가 발생한다.

이를 해결하려면 file:// 프로토콜을 앞에 덧붙여 파일 시스템상의 패키지라고 명시해주면 해결 할 수 있다.

yarn global add file:$PWD # yarn으로 현재 디렉토리의 패키지를 전역 설치

두개의 명령어 출력을 하나로 합치는 방법

Programming

예를 들어 echo fooecho bar, 두 개의 명령어의 출력을 하나로 합쳐서 cat으로 파이핑 하고 싶다면 아래와 같은 방법으로 해낼 수 있다.

# 방법 1
( echo foo ; echo bar ) | cat

# 방법 2
{ echo foo ; echo bar ; } | cat

꼬리재귀(Tail Recursion)란

Programming

Tail Call

Tail Call은 어떠한 함수가 Return 명령어를 만나기 바로 직전에 호출 되는것을 뜻한다.

이때의 직전, 혹은 마지막이란 위치 개념은 컴파일 이전의 코드에서의 개념이 아닌, 실제 스택 프레임의 할당 해제 가 일어나기 직전의 위치를 뜻한다.

그러므로 다음과 같은 경우는 코드의 마지막에 위치하지만 Tail Call에 해당하지 않는다.

e.g.

return func(n--);  // 꼬리 호출이 아니다. (호출이 일어난 뒤, n의 감소가 이루어진다)
// 만약 위 코드가 `return func(--n)` 였다면, 꼬리 호출이다.

TCO

TCO(Tail Call Optimization)는 마지막 호출에서 Call (Tail call) 을 하는경우, 새로운 스택 프레임 생성을 반복 하지 않고

같은 스택 프레임 내에서 다시 호출되는 함수의 진입점으로 Jump 하여 루틴을 진행할 수 있는것을 뜻한다(스택 프레임의 재사용 안전성).

그리고 Recursion 즉, 자기 자신을 호출하는 함수가 명령어의 가장 마지막에 위치할 때 이것을 Tail Recursion이라고 한다.

Tail Recursion Elimination

TCO(Tail Call Optimization)의 특별한 경우인 Tail Recursion Elimination 은 어떠한 함수가 꼬리재귀에 해당 할 때,

이를 반복문의 형태로 재구성 할 수 있는것을 뜻한다.

많이 착각하는 부분은, 꼬리 재귀의 형태로 구현이 되면 Tail Recursion Elimination이 된다고 생각하는 것인데,

이는 재구성 할 수 있다 라는 것이지 실제 컴파일러에서 최적화를 진행하지 않으면 일반적인 재귀와 마찬가지로 일반적인 Call이 이루어지게 된다.

Reference