나는 아크에 대해 많은 것을 읽었으며 좋은 점을 제공하는 것으로 보인다. 아크는 리스프이고 Clojure는 리스프이기 때문에 아크가 Clojure 위에 구현 될 수 있는지 궁금해했다.Clojure를 통해 Arc를 구현할 수 있습니까?
1
A
답변
1
즉시 볼 수있는 가장 중요한 문제입니다. Arc에는 실제 tail-call 최적화가 있으며 clojure는 JVM 제한 때문에 발생하지 않습니다. AFAIK은 최소한 Arc 함수를 JVM 메서드로 직접 호출 할 수있는 기능을 포기해야 함을 의미하며 Arc 함수를 Clojure 함수에 직접 매핑 할 수는 없다는 것을 의미한다.
아마도 평범한 클로저를 사용하여 컴파일 된/효율적인 버전의 아크를 쉽게 만들 수 없다는 것을 의미합니다. 다른 한편으로는 "장난감"통역사가 자신이하는 일을 안다면 너무 어려워서는 안됩니다.
1
Clojure에서 Arc 컴파일러를 구현하는 데 큰 즐거움을 안겨주지 만, JVM 바이트 코드로 컴파일하는 것은 위에서 언급 한 TCO 문제로 인해 조금 더 어려울 수 있습니다. Clojure로 작성 되었기 때문에 JVM을 대상으로해야한다는 것은 아닙니다.
한편, Arc 인터프리터는 매우 합리적입니다.
Clojure의 아크 구현이 반복 동작과 동일한 방식으로 꼬리 재귀 호출을 자동으로 제거하지 못합니다. 마찬가지로, 유사한 자동 변환은 일반적인 경우에 트램펄린을 목표로 할 수 있습니다. – fogus
예, 그렇지만 문제를 이해하는 한, 아크가하는 것과 동일한 보장을주기 위해 자기 재귀가 아닌 모든 꼬리 호출을 "trampoline"해야합니다. 당신은 어디에서나 연속 전달을 사용해야한다는 것을 의미합니다. 그것은 물론 할 수 있지만, 클로저가 그것을 사용하지 않는 이유가 있습니다. –