지금 G머신 인터프리터 부분(executor.hs)만 읽었음
책에 설명되어있는거 질문할 수도 있음 ㅈㅅ
L89, L91: NPtr 0 또는 NCon _ _ 인 경우에 Unwind를 안 하고 리턴한다는 것은 상수값은 그냥 리턴한다는 의미로 이해하면 됨?
L92: NApp f x일때 다음 transit에 스택으로 (f:x:stack)이 아니라 (f:top:stack)을 패싱하는 이유를 잘 이해 못했음
L124: allocate (NPtr 0)는 그냥 placeholder로만 사용되고 addr는 다른 노드를 가리키도록 재지정되는건가
L126: (code, stack)이 env에 들어가는데 어디서 문맥 복구가 다시 이루어지는거임
L131, L137: 각각 NCon이 어떻게 활용되는지를 잘 이해 못함
코드가 깔끔해서 다른 부분은 알아들은듯
그리고 SuperCombinator는 그냥 컴파일 타임에 정의된 함수 목록 맞나
supercombinator는 탑 레벨 함수를 의미하는 말이고, NPtr 0는 그냥 플레이스 홀더임.
transit (Unwind : []) stack envs는 transit [] stack' envs로 전이하는데, stack'의 루트 노드가 WHNF임.
여기서 루트 노드는 맨 뒤에 있는 노드를 말함.
stack'의 루트 노드가 WHNF인건 상위 컴파일러의 구현에 의해 보장되는거지? - dc App
ㅇㅇ
eval이 top을 unwind한거니까 여기서 strict evaluation이 일어나는거라고 봐도 되나 - dc App
근데 eval에서 (code, stack)을 env에 넣는 이유는 뭐임? env가 어디서 쓰이는지 모르겠음 - dc App
여기선 Lazy 평가 밖에 없음;
eval 이후 컨텍스트 복구라고 생각했는데 복구 로직이 안 보여서 - dc App
지금의 평가 환경을 저장해 놓고 top을 루트 노드로 하여 새로운 평가 환경을 조성하는 게 Eval 명령어임
L84가 컨텍스트 복구임
원래 책에는 이렇게 안 나왔는데, 내가 개조한 거 거든? 틀렸을 수도 있음.
아 그렇네 L84에서 복구하네 ㅇㅋㅇㅋ - dc App
그리고 f : x : stack으로 안 쌓는 이유는 update 쉽게 하기 위함이고, 안 쌓아도 되는 이유는 loadArgs 덕분임
이 부분은 좀 더 읽어봐야겠다 - dc App
f : x : stack으로 쌓으면 명령어 Update가 오작동함
L107에서 Update가 아까 그 top addr를 새로운 top'을 가리키도록 하는거 맞나 - dc App
ㅇㅇ
"L131, L137: 각각 NCon이 어떻게 활용되는지를 잘 이해 못함" 이건 내일 Generator 읽으면 될 거임
"L124: allocate (NPtr 0)는 그냥 placeholder로만 사용되고 addr는 다른 노드를 가리키도록 재지정되는건가" 이것도 내일 Generator 읽으면 됨
ㅇㅋㅇㅋ 컴파일러 부분 재밌을듯 - dc App
NPtr 0는 재귀적인 정의를 위해서 임시로 잡아주는 공간일 수도 있고 속박된 변수일 수도 있음.
generator에서 letrec 경우에만 alloc을 하는걸로 봐서 여기서 재귀적 정의에 쓰이는건가보네 - dc App
ㅇㅇ
답변 ㄱㅅㄱㅅ 덕분에 g머신 많이 배워감 - dc App
ㅇㅇ 읽어줘서 고마워