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
Liminus/Conman 에서는 아예 DB SQL 파일 + 주석을 읽어서, 주석에 따라 DB 함수를 아예 만들어버리는데 (!!) 이런방법을 통해서 하는게 아닐까 추측.. 해본다.
luminus-framework/conman: a helper library for managing database connections (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)
clojure 에서는 from->to 꼴로 함수를 작성하는게 함수명 이디엄인데 (보통 AtoB 나 A2B 라고 쓰는 함수들)
이걸 map 만 넘겨주면 from->to 꼴 함수로 만들어주는 기능이다.
일단은 "소주 1병을 마시면 맥주 몇병을 마셔야 같은 알코올양일까?" 와 같은 기준을 잡고 해당 기능을 구현해보았다.
intern 테스트하는 법을 모르겟다 젠장. REPL 상에서는 잘되는것 같다. -> 그냥 사이드 이펙트함수에 map (lazy) 를 써서 그렇다..
단위나 목적별로 변환 기준의 명확하지 않을수 있으므로 convert 룰? 같은것도 주입받을수 있도록 해보아야 겠다..
'프로그래밍 언어 노트 > Clojure' 카테고리의 다른 글
Clojure 의 매크로 시스템의 튜링완전 (애매한) 증명 feat SKI (0) | 2024.07.14 |
---|---|
[clojure] clj-oauth2 를 통해서 github Oauth 를 가져와 보자 (0) | 2021.07.20 |
[Clojure/Luminus] Luminus + Intellij 시작 설정 (0) | 2021.05.11 |
[Clojure] Idiomatic Clojure - Code Smells (관용적인 클로저 - 코드 스멜) (0) | 2021.01.18 |
[Clojure] Clojure Reactive 와 Clojure CSP(clojure.async) (0) | 2020.12.17 |