2015년 9월 1일 화요일

Living Clojure -- Week 2, Day 2

다시 50번대
문제 51 Advanced Destructuring
(= [1 2 [3 4 5] [1 2 3 4 5]] (let [[a b & c :as d] __] [a b c d]))

그러고보면 Destructuring은 Scala/Haskell에서 패턴매치에 적용되어 있는 것이고, JavaScript에도 변수바인딩시에 Destructuring을 사용할 수 있게 되었다.



와우, 이제 80번대!
문제 83 A Half-Truth
(= false (__ false false))

이건 좀,,, 뭐랄까? 암튼 특이한 문제다. 모두 참이면 안되고 일부만 참인지 확인하는 함수를 작성하는 것.

(fn [& x] (and (not (reduce #(and %1 %2) x)) (reduce #(or %1 %2) x)))
그냥 말 그대로를 옮겼다. 여기서 (apply and xs) 같이 시도했다가 apply 에 매크로를 사용할 수 없다는 오류를 만났고, 다시 (reduce and xs) 를 시도했다가 역시 매크로를 사용할 수 없다는 오류를 만났다. 매크로는 마치 함수처럼 사용하지만 함수가 아니라는 점! 매크로는 강력하지만 매크로인걸 알고 써야 한다는 점이 함정이다.

and나 or에 해당하는 함수가 있다면 조금더 간단했을까?



다시 60번대, 기준이 뭘까?
문제 66 Greatest Common Divisor
(= (__ 1023 858) 33)

이건 유클리드법인가? 결국 재귀로 풀 수 있다.
(fn gcd[a b]
  (cond (= a 0) b
        (> a b) (recur (- a b) b)
        :else (recur (- b a) a)))

:else를 몰라서 Scheme에서처럼 else를 사용해서 오류.
하는김에 Scheme의 cond와 비교하자면 Scheme은 좀더 syntax tree가 깊다. 조건-값 쌍을 한번더 괄호로 감싸준다. 즉 각 브랜치가 하나의 리스트로 표현되는데, Clojure에서는 그걸 펼쳐놓았다. cond도 매크로!


오늘은 달랑 세문제!

댓글 없음:

댓글 쓰기