프로젝트 문서에 따르면 val 을 이용해 새로운 변수를 선언할 때는
(val x E) assigns name x to the value obtained by evaluating E
즉 E를 eager evaluation해 얻은 값을 대입해야 한다고 이해했습니다.
그런데 lazy infinite loop 테스트 케이스의 경우 다음과 같습니다
|(let
| (def loop () (app loop))
| (lazy-val x (app loop))
| (def f (a (by-name b)) a)
| (val bb (app f x (app loop)))
| 3)
val bb를 선언할 때 (app f x (app loop)) 가 반드시 evaluate 돼야 하는데, loop는 영원히 terminate하지 않기 때문에 인터프리팅이 여기서 멈추게 돼버립니다.
여기서 테스트케이스가 의도한 답인 VInt(3) 이 나오려면 bb 또한 lazy-val 로 선언돼야 하는 것이 아닌가 질문드려봅니다.