알라딘MGG와이드바


꽤 실용적인 Lisp 인 Clojure 배우기 개발 이야기

"1년에 한 개쯤은 새로운 언어를 배워보자" 올해 배워볼 언어는 Clojure 가 될 거 같다.
사실 1-2년 전에 SICP 와 Erlang 을 공부했었지만 아직까지도 함수형 언어는 멀게만 느껴졌었는데 반해
Clojure 는 Java 위에서 구현된 언어다보니 좀 더 해 볼만하다는 느낌을 준다.
자료형도 대강 무엇으로 되어 있을지 알 수 있을거 같고
Eclipse 와 연동되어 돌아가는 개발 환경도 쓸만하다.
Java 코드는 뭐든지 간단하게 실행할 수 있는 점은 자바에 익숙한 개발자에게 가장 큰 장점일 듯.

설치하는 방법은 여기를 참고하면 된다.
.clj 파일에 clojure 코드를 작성한 뒤 Ctrl + Atl + L 을 누르면 eclipse 가 알아서 REPL 에 로딩한 후 평가까지 해 준다.

스터디를 하면서 projecteuler 문제를 몇 개 풀어보았다.
그냥 책만 보는 게 토익책으로 영어 공부하는 거라면, 실제로 문제를 풀어보는 것은 어학연수가는 느낌이랄까...
간단한 문제를 풀어보는 것이 훨씬 빠르게 언어를 이해할 수 있는 방법이라는 것을 다시 한 번 알게 되었다.
문명5 도 한 게임 끝냈으니(덕분에 2주 날려먹었다. 젠장...) 공부 좀 해 볼까나.


   1: ; 문제 1번 : Add all the natural numbers below one thousand that are multiples of 3 or 5
   2: (defn pred1[n] (or (= (rem n 3) 0) (= (rem n 5) 0)))
   3: (reduce + (filter pred1 (range 1 1000)))
   4:  
   5: ; 문제 2번 : Find the sum of all the even-valued terms in the Fibonacci sequence which do not exceed four million
   6: (defn fibo []
   7:   (map first (iterate (fn [[a b]] [b (+ a b)]) [0 1])))
   8: (reduce + (filter even? (take-while #(>= 4000000 %) (fibo))))
   9:  
  10: ; 문제 3 : Find the largest prime factor of a composite number.
  11: ; 꼬리재귀이기는 하나 clojure(즉, 자바) 는 꼬리재귀를 지원하지 않아 over-flow 가 나는 예제
  12: (defn div-pf [x n]
  13:   ;(println n x)
  14:   (if (= x n)
  15:     x
  16:       (if (= (rem x n) 0)
  17:         (div-pf (quot x n) n)
  18:         (div-pf x (+ n 1)))
  19:    )
  20: )
  21: (div-pf 13195 2)
  22: ;(div-pf 600851475143 2)
  23:  
  24: (defn fibo []
  25:   (map first (iterate (fn [[a b]] [b (+ a b)]) [0 1])))
  26: (reduce + (filter even? (take-while #(>= 4000000 %) (fibo))))
  27:  
  28: ; 문제 3 : Find the largest prime factor of a composite number.
  29: ; recur 를 쓴 버전
  30: ; recur 의 인자는 loop 의 binding 인자를 다시 바인딩하기 때문에 서로 갯수가 같아야 한다.
  31: ; 소인수분해 최적화 알고리즘은 전혀 적용하지 않았음. 기억이 안 나...
  32: (defn div-pf-recur [x n]
  33:   (loop [x x n n]
  34:     ;(println x n)
  35:     (if (= x n)
  36:       n
  37:       (if (= (rem x n) 0)
  38:         (recur (quot x n) n)
  39:         (recur x (inc n))
  40:       )
  41:     )
  42:   )
  43: )
  44:  
  45: (div-pf-recur 600851475143 2)


덧글

댓글 입력 영역


Yes24위대한게임의탄생3

위대한 게임의 탄생 3
예스24 | 애드온2