Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- Clojure
- traits
- sprintf
- async
- haskell
- coroutines
- SHA512
- stringprintf
- RAII
- program
- WebView
- go
- Scala
- type_traits
- SHA1
- c++
- template
- Chrono
- Reflect
- web
- CustomTab
- ChromeTab
- Observer
- sha256
- Android
- design pattern
- ranges
- Functional
- kotlin
- AES
Archives
- Today
- Total
프로그래밍 검색 블로그
clojure 오버로딩 2 (defmulti / defmethod) 본문
정확히는 오버로딩이 아니지만
clojure에서는 dispatcher를 커스텀하여 타입별로 오버로딩할수 있게 한다
런타임중에 class 함수로 동적으로 오버로딩 하기 때문에 null check도 할수 있다
1 2 3 4 5 6 7 8 9 10 | (class String) => java.lang.Class (class Integer) => java.lang.Class (class nil) => nil (def f 5) (class 5) => java.lang.Long | cs |
check가 사용할 함수의 이름이다
일단 defmulti를 통해 dispathcer를 선언해준다
1 | (defmulti check class) | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | (defmethod check :default [a] (println "default")) (defmethod check nil [a] (println "nil")) (defmethod check String [a] (println "String")) (defmethod check Number [a] (println "Number")) (defmethod check Double [a] (println "Double")) | cs |
그후 dispatcher의 구현이 되는 함수들을 등록해주면 된다
여기서 :default는 매칭이 모두 실패하면 마지막으로 가는 값이다
테스트
1 2 3 4 5 6 7 | (check 3) (check (cast String nil)) (check 2.0) (check (float 7.0)) (check print) (defn foo [] nil) (println (class (cast String (foo)))) | cs |
Number
nil
Double
Number
default
nil
dispathcer의 함수에 따라서 값에 대한 오버로딩도 가능해진다
[identity] 를 사용하면 피보나치를 함수 3개로 나눠서 정의하는것도 가능해진다
1 2 3 4 5 6 7 8 | (defmulti fibo identity) (defmethod fibo 0 [_] 0) (defmethod fibo 1 [_] 1) (defmethod fibo :default [n] (+ (fibo (- n 1)) (fibo (- n 2)))) (print (fibo 10)) | cs |
'clojure기초' 카테고리의 다른 글
clojure promise (0) | 2017.11.04 |
---|---|
clojure 스레드 (0) | 2017.11.04 |
clojue fibonacci / lazy-seq (0) | 2017.10.29 |
clojue fibonacci / memoize (0) | 2017.10.29 |
clojure 오버로딩 (0) | 2017.10.28 |
Comments