일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- stringprintf
- design pattern
- Observer
- SHA1
- go
- coroutines
- kotlin
- SHA512
- type_traits
- Functional
- CustomTab
- web
- template
- ChromeTab
- haskell
- program
- Android
- AES
- async
- Scala
- Reflect
- traits
- ranges
- RAII
- sprintf
- Clojure
- WebView
- sha256
- c++
- Chrono
- Today
- Total
목록Functional (32)
프로그래밍 검색 블로그
12(reduce + [1 2 3 4])=> 10cs reduce [함수] [원소] 12(reduce + 99 [1 2 3 4])=> 109csreduce [함수] [초기값] [원소] 동작하는 방식은 초기값이 있을 때는 첫번째 인자가 초기값,두번째 인자가 리스트의 원소, 함수호출 1번 두번째 부터는 처음 계산한 값이 첫번째 인자두번째는 리스트의 원소 식으로 계산된다 리스트형의 경우에는 별로 중요하지 않을수도 있는데 문제는 맵 (#으로 시작하는 함수는 람다식, val은 MapEntry에서 value를 가져온다) 12(reduce #(+ (val %1) (val %2)) {:a 1 :b 2 :c 3})ClassCastException java.lang.Long cannot be cast to java.uti..
map 가변 인자를 받을 수 있는데 첫번째는 해당하는 함수가 있어야 한다 2개를 받았을때는 각 리스트에 해당하는 함수를 호출하여 반환한다 12(map inc [1 2 3]) => (2 3 4)cs 3개를 받았을때는 인자를 두개받는 함수가 들어가서 그 결과를 반환한다12(map + [1 2 3] [4 5 6])=> (5 7 9)cs 이때 원소의 개수가 작은쪽에 맞추며 나머지는 무시한다 1234(map + [1 2 3 4] [5 6])=> (6 8)(map + [1 2] [3 4 5 6])=> (4 6)cs 4개 이상도 동일하다12(map + [1 2] [3 4 5 6] [1 2 3 4])=> (5 8)cs
condp는 함수, 비교값을 받아서 그 함수에 유효한 첫번째 값을 반환한다 123456789(defn foo [x] (println (condp = x 1 "one" 2 "two" 3 "three" 4 "four" "other value" )))cs이렇게 했을때는 인자로 숫자가 들어왔을때 순서대로 동일한 값을 반환한다 12345(foo 2)(foo "A")(foo 3.0)(foo 1)(foo 0)cs출력 :twoother valueother valueoneother value 비교함수에 =를 넣었을떄는 앞의 case와 동일하다. 인자를 바꿔서operator > 를 넣었을때는 123456789(defn foo [x] (println (condp > x 1 "one" 2 "two" 3 "three" 4 "f..
123456789101112(defn foo [x] (println (case x "A" "string a" 1 "number 1" "other") ) ) (foo 20)(foo "A")(foo 33.0)(foo 1)cs출력: otherstring aothernumber 1 이쪽은 C++의 switch - case와 비슷하지만타입과 관계없이 모두 매칭 시킬수 있다는 장점이 있다 또한 String부터 비교를 시작했어도 에러가 나지 않는다 java.lang.Object의 equals를 사용하는듯 하다
어렵고 까다로운 문법임에도 불구하고 함수형을 사용하는 몇가지 이유중 하나가 바로 패턴 매칭이다 cond 조건1, 값1, 조건2, 값2 .... 123456789101112(defn foo [x] (println (cond (instance? String x) "is string" (> x 10) "less 10" :else "other"))) (foo 20)(foo "A")(foo 33.0)(foo 1)Colored by Color Scriptercsinstance? 는 자바의 instanceof와 동일하다 출력 :less 10is stringless 10other cond 함수는 인자를 2가지씩 받는다 첫번째 인자는 조건함수를 나타내고 두번째 인자는 값을 나타낸다조건함수를 실행 혹은 판별 시 true라..
loop를 사용아직 코드에 문제가 있긴하지만 지금까지 한것을 알아보는 의미로 작성 12345678 (defn fac [x] (loop [i x val 1] (if (= 1; i--){ val *= i; } return val;}Colored by Color Scriptercs 최대한 비슷하게 구현한 C++코드 1234567891011int fac(int x){ int val = 1; int i = x; LOOP: if(i
loop 에서는 let과 비슷하게 루프 안에서만 사용할 수 있는 변수를 정의할 수 있고 recur를 호출하는것으로 가장 가까운 스코프의 loop 로 돌아갈 수 있다 recur는 인자로 들어가는 값으로 loop를 다시 실행하는데 recur에 인자로 들어가는 값의 숫자와 loop 값의 숫자가 같아야 한다 123456(defn foo [] (loop [i 0] (println i) (if (
함수형 언어라도 극단적으로 재귀만 사용하지 않는 이상 내부적으로 선언되어 사용할수 있는 변수정도는 선언할 수 있다 let 키워드로 사용한다 사용법은 let [변수이름, 값, .....] 123(defn foo [] (let [a 0] (println a)))cs 함수 foo 안에서변수 a를 0으로 선언한다음 그 a를 바로 출력한다 123(defn foo [] (let [a 0 b 1 c 2] (println a)))cs 여러개 선언 시에는 이름, 값이 =이나 : 같은 구분자로 구분하지 않고 공백으로 구분하다보니 보기 힘들수도 있다 1234(defn foo [] (let [a (+ 1 2) b 1 c 2] (println a) (println c)))cs da = 3b = 1c = 2 값 할당에 함수가 들..
함수를 만들때는 defn 를 사용한다 12(defn square [x] (* x x))(println (square 3))cs 단순히 제곱시키는 함수인데 특이한게 전부 제네릭으로 되어서 인자를 받지 않는다 함수를 호출할때 (square "a")같이 문자열로 넣게 된다면 런타임 에러
clojure 에서는 거의 모든것이 함수인데 (함수이름 인자1 인자2...) 같은 방식으로 사용이 가능하다 물론 이러한 방식은 사칙연산 마저 예외가 아니라서 2 + 2 * 2 같은 수식을 계산하여 출력 하려면 12;error(println (2+2*2))cs 이렇게 실행시키면 에러가 나고 이렇게 함수호출을 통해서 사용해야 한다 12;ok(println (* (+ 2 2) 2))cs 조건 검사또한 이렇게 인자를 3개 받는 if 함수와 operator> 함수를 통해서 사용해야한다 1(println (if (> 1 2) "if" "else"))cs 위 코드를 C계열 언어에서는 1234if(1 > 2) print("if")else print("else")cs lisp 계열의 이러한 함수호출 방식은 괄호 이외의 ..