사용자 정의 이름을 가진 다른 함수를 리턴하는 Clojure 함수를 작성하려고합니다. 내 시도까지 :Clojure : 런타임에 매개 변수로 주어진 이름의 함수를 작성하십시오.
(defn function-with-custom-name [name] (fn name [] 42))
(function-with-custom-name "hello")
# --> #object[lang.main$function_with_custom_name$name__4660 0xa6afefa "[email protected]"]
# syntactically ok, but its name is 'name' and not 'hello'
(defn function-with-custom-name [name] (fn (symbol name) [] 42))
# --> CompilerException java.lang.IllegalArgumentException: Parameter declaration symbol should be a vector, compiling:(/tmp/form-init3365336074265515078.clj:1:40)
(defn function-with-custom-name [name] (fn '(symbol name) [] 42))
# --> CompilerException java.lang.IllegalArgumentException: Parameter declaration quote should be a vector, compiling:(/tmp/form-init3365336074265515078.clj:1:40)
내가 fn
매크로, 따라서 적절한 인용이 매개 변수 아마 중요하지만, 위의에 따라, 나는 바로 그것을 얻을 수 없다는 것을 이해하지만 나는 99 % 확신 (fn
의 출처를 살펴보면) 첫 번째 매개 변수가 기호로 인식되어야한다는 유일한 기준이 있기 때문에 방법이 있습니다.
이 작업을 수행하는 방법에 대한 힌트가 있습니까?
EDIT : 의견에서 묻는대로 유스 케이스 : 저는 Clojure에서 간단한 언어 해석기를 작성하고 있습니다 (다른 것들 중에서도) 기능을 만들 수 있습니다. 내 언어의 함수는 현재 익명의 Clojure 함수로 표현됩니다. 그러나 Clojure 함수에도 이름이 있으면 인터프리터 디버깅이 훨씬 쉬워집니다.
EDIT2 : 첫 번째 편집을 통해 나는이 문제에 대한 매크로 기반 솔루션을 사용할 수 없다는 결론을 내 렸습니다. 런타임에 함수를 만들 필요가 있기 때문에 (그리고 지금까지는 매크로는 컴파일시에만 작동한다는 것을 기억하십시오.) -> 명확성을 위해 질문 제목을 변경했습니다. 매크로 기반 응답은 유용한 통찰력을 제공하므로 삭제하지 마십시오.
이에 대한 사용 사례를 명확히 수 (즉 런타임에 fn을 작성하는 이유와 사용 방법). –
@AlanThompson : 편집을 참조하십시오. – Attilio