하스켈같은거 보면 pure function 파트하고 IO 파트가 나뉘어 있잖아.

이걸 좀 극단적으로 가져가서 pure function 파트에 있는 코드를 전부 컴파일 타임에 연산하는거.

연산한 결과는 IO 타입의(AST 같은거) main이라는 값이 되고, 이걸 다시 컴파일해서 바이너리를 얻음.

IO 타입 자체가 rust마냥 메모리 안정성 같은걸 보장하면 더 좋고.


물론 컴파일에 성공 하려면 pure function 파트가 정지 해야됨.

그러니까 불완전한 totality 검사에 기댈지, 컴파일러가 종료하지 않을 가능성을 남겨둘지 둘중에 선택해야됨.


함수형 단점이 gc를 때놓을 수가 없다는건데, 이렇게 하면 gc는 컴파일 타임에만 존재함.

Nat = Z | S Nat 같은 졸라 비효율적인 자료형도 런타임 값이 포함할 수 없게하면 컴파일 타임에 다 지울 수 있음


좀 다르게 보면 pure 한 파트를 IO 코드를 생성해내는 type-safe한 매크로처럼 쓰는거지.

pure파트를 컴파일 타임에 돌린다 봐도 되고, 매크로를 강타입 순수 함수형 언어로 만든다고 봐도 됨.


(말만 쉬움)