일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- SHA1
- SHA512
- RAII
- coroutines
- traits
- template
- ChromeTab
- design pattern
- sprintf
- sha256
- Android
- Observer
- c++
- program
- Scala
- kotlin
- ranges
- type_traits
- web
- haskell
- go
- Chrono
- AES
- WebView
- Clojure
- async
- Functional
- CustomTab
- Reflect
- stringprintf
- Today
- Total
목록Functional (32)
프로그래밍 검색 블로그
어떤 사이드 이펙트가 있는 작업을 하거나반복적으로 해야할 일이 있을때 사용 step을 통한 역순회나 조정은 없으며 0부터 n - 1 까지 밖에 없다 123456789101112(dotimes [i 9] (println i))012345678=> nilcs 1234567891011121314(dotimes [i 9] (let [n (+ i 1)] (println "2 * " n "=" (* 2 n)))) 2 * 1 = 22 * 2 = 42 * 3 = 62 * 4 = 82 * 5 = 102 * 6 = 122 * 7 = 142 * 8 = 162 * 9 = 18=> nilcs
다른 언어에서 channel 비슷한 개념이다일단 다른언어에서 사용하는것과 유사하게 사용해보았다 공용으로 접근 가능한 p 객체로 @p 를 하면 응답이 올때까지 기다렸다가 출력하고 다음 코드를 진행한다 12345678(def p (promise)) (. (new Thread #(do (Thread/sleep 2000) (deliver p 21))) start)(println "1")(println @p)(println "2")cs출력:1212
123 (let [t (new Thread #(print "in thread"))] (. t start))cs 스레드를 만들어서 스레드 안에서 호출하는 부분이다이 코드는 다음과 같은 자바 코드와 유사하다 12Thread t = new Thread(()->System.out.println("in thread"));t.start();Colored by Color Scriptercs
정확히는 오버로딩이 아니지만 clojure에서는 dispatcher를 커스텀하여 타입별로 오버로딩할수 있게 한다 런타임중에 class 함수로 동적으로 오버로딩 하기 때문에 null check도 할수 있다12345678910(class String)=> java.lang.Class(class Integer)=> java.lang.Class(class nil)=> nil (def f 5)(class 5)=> java.lang.Longcs check가 사용할 함수의 이름이다일단 defmulti를 통해 dispathcer를 선언해준다 1(defmulti check class)cs 1234567891011121314(defmethod check :default [a] (println "default")) (def..
앞서 clojure로 작성했던 피보나치 수열 구하기는 관계형 언어에 가까운 방식으로 함수형 언어에서는 지연 처리를 통한 무한 수열을 주로 사용한다 이러한 무한 수열을 만들 때 사용하는 것이 lazy-seq 함수이다 이 함수를 통해서 무한 수열을 생성해내도 실제 사용 전까지는 문제가 발생하지 않는다 1234(defn fibo ([] (cons 1 (fibo 0 1))) ([a b] (lazy-seq (cons (+ a b) (fibo b (+ a b))))))cs 일단 2번째 줄의 함수가 인자가 없는 사용자가 호출하는 함수이다 1과 함께 인자를 두개 받는 fibo를 호출한다 두번째로 내부적으로 사용하는 함수인데 [인자1과 인자2를 더한값] 에 fibo [인자2 + [인자1과 인자2를 더한 값]]을 호출하는..
피보나치 수열을 clojure로 만들어보자 일반적으로 피보나치 수열은 C++로 이런 방식으로 만들수 있는데 (코드가 비효율적인 것은 일단 논외로) 12345int fibo(int a){ if(a == 0) return 1; if(a == 1) return 1; return fibo(a - 1) + fibo(a - 2);}Colored by Color Scriptercs 이걸 일단 그대로 clojure 로 옮겨보면 12345(defn fibo [n] (case n 0 1 1 1 (+ (fibo (- n 1)) (fibo (- n 2)))))cs 이렇게 나올수 있다 이걸 clojure에서는 memoize 함수를 사용해서 저장시킬수 있다 C++로 비슷하게 생각해보면 아마 이렇게 될것이다 12345678int ..
clojure에서는 원소의 개수에 따라서 오버로딩을 할 수 있다 그러나 다른 프로그래밍 언어에서 생각하던대로 그냥 두개의 함수를 정의하면 에러가 나고123(defn func [] (println "nothing"))(defn func [a] (println "once"))=> Exception in thread "main" clojure.lang.ArityException: Wrong number of args (0) cs 다음과 같이 한 함수 안에서 두개의 함수를 정의해야 한다 123456789(defn func ([] (println "nothing")) ([a] (println "once")) ([a b] (println "twice"))) (func)(func 1)(func [1 2 3])(fun..
clojure 에서 자바와 연결하는 방법은 다른 모듈에 연결하는것처럼 할 수 있다1(import java.util.Random)cs일단 import로 추가를 선언해준뒤 123(let [rand (new Random)] (println (. rand nextInt)) (println (. rand nextInt 3)) )cs 클래스 기반 구조라서 clojure에는 맞지 않을 수도 있는데 랜덤 클래스를 선언하고 nextInt를 호출하였다 이렇게 .을 호출하는 구조도 있고 이런 문법도 지원한다 123(let [rand (new Random)] (println (.nextInt rand)) (println (.nextInt rand 3)))cs 아직까지는 테스트 해본 모든 IDE에서 자동완성이 되는것 같지 않아..
apply [함수] [?가변인자] [any collection] 함수 + 가변인자 + collection으로 받은 인자를 모두 모여서 출력시킨다 이때 마지막에 붙는 collection은 풀어서 foreach로 넣는다 12(apply + [1 2 3])=> 6cs 이렇게 했을때 기본적으로 맨 마지막으로 붙은 컬렉션은 순회를 하는것으로 6을 반환한다 reduce는 collection만 가지고 처리를 할수 있었다면 이쪽은 원소 + 컬렉션이기때문에 이러한것도 가능하다 12(apply + 1 2 3 [1 2 3])=> 12cs 맨 마지막의 원소만 컬렉션을 받을수 있기 때문에 12apply + 1 2 [1 2] [1 2 3])ClassCastException clojure.lang.PersistentVector c..
range 12(range);무한루프cs 0부터 시작하는 무한대의 정수형 수열을 반환한다. 단독으로 사용시에는 무한루프가 발생하며 다른 함수로 제약이 있어야 한다 range [end] 인자가 하나 주어졌을때는 0부터 end-1까지 수열을 반환한다 12(range 10)=> (0 1 2 3 4 5 6 7 8 9)cs range [begin] [end] 범위가 주어졌을때는 begin부터 end-1까지 수열을 반환한다 12(range -5 10)=> (-5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9)cs range로 생성한 수열은 즉시 계산해서 할당하는 것이 아니라 게으르게 처리한다