본문 바로가기

프로그래밍 언어 노트/Clojure

[Clojure] Clojure 에서 Runtime 함수를 생성해보자

Clojure 에는 intern 이라는 함수가 존재한다.

Finds or creates a var named by the symbol name in the namespace ns (which can be a symbol or a namespace), setting its root binding to val if supplied. The namespace must exist. The var will adopt any metadata from the name symbol. Returns the var.

네임스페이스에 새로운 var 를 추가할수있는데,

함수또한, var 에 바인된것에 불과하므로 intern 을 이용하여 함수를 런타임에 추가할수있다!

 

functional programming - Clojure: How to create a function at runtime - Stack Overflow

 

Clojure: How to create a function at runtime

I want to generate a fn totally at runtime (i.e. the name and the arg symbols are decided at runtime, not in code) What's the best way to achieve this ? For example how can I implement the follo...

stackoverflow.com

 

Liminus/Conman 에서는 아예 DB SQL 파일 + 주석을 읽어서, 주석에 따라 DB 함수를 아예 만들어버리는데 (!!) 이런방법을 통해서 하는게 아닐까 추측.. 해본다.

luminus-framework/conman: a helper library for managing database connections (github.com)

 

luminus-framework/conman

a helper library for managing database connections - luminus-framework/conman

github.com

;conman 코드중 발최
(defn intern-fn [ns id meta f]
  (intern ns (with-meta (symbol (name id)) meta) f))

 

그래서 나도 해보았다!

Lee-WonJun/cftf: Create a "from->to" style function (github.com)

 

Lee-WonJun/cftf

Create a "from->to" style function. Contribute to Lee-WonJun/cftf development by creating an account on GitHub.

github.com

clojure 에서는  from->to 꼴로 함수를 작성하는게 함수명 이디엄인데 (보통 AtoB 나 A2B 라고 쓰는 함수들)

이걸 map 만 넘겨주면 from->to 꼴 함수로 만들어주는 기능이다.

일단은 "소주 1병을 마시면 맥주 몇병을 마셔야 같은 알코올양일까?" 와 같은 기준을 잡고 해당 기능을 구현해보았다.

intern 테스트하는 법을 모르겟다 젠장. REPL 상에서는 잘되는것 같다. -> 그냥 사이드 이펙트함수에 map (lazy) 를 써서 그렇다..

단위나 목적별로 변환 기준의 명확하지 않을수 있으므로 convert 룰? 같은것도 주입받을수 있도록 해보아야 겠다..

 

728x90