Tag Archives: Clojure

[도서] 해커와 화가 – 비아웹?? 창업자의 글 모음

비아웹.. 야후에 팔렸다는데 잘 모르겠다.
비싸게 팔렸겠지?

성공한 벤처기업인이라 그런지… 아니면 이런 사람이라 성공한 사업가가 될 수 있었던건지.. 
경제인의 시야를 가지고 있다. 공돌이가 아닌

근원적인 가치를 부로 정의하고 영어로는 wealth라고 썼을래나..
money,화폐,돈과 구분해서 생각할 줄 아는

나는 에너지와 혁신을 경제발전의 근원?으로 보고 있었는데 나만 그런건 아니었나 싶다.
미국에는 이런 생각을 가진 사람이 많은건가

리습

  1. 조건문conditional – if then else
  2. 함수의 타입function type – 함수도 변수처럼 타입
  3. 재귀 recursion
  4. 동적 타이핑 dynamic typing – 모든변수는 궁극적으로 포인터, 변수가 아니라 값, 변수 할당은포인터 자체를 복사
  5. 가비지 컬렉션 garbage collection
  6. 표현으로 이루어진 프로그램 
  7. 심볼 타입 symbol type – 문자열을 가리키는 포인터
  8. 심볼과 상수의 트리를 이용하는 코드를 위한 표기 방식 notation 
  9. 언어 전체를 계속 사용할 수 있음 – 읽는시간, 컴파일하는시간, 실행시간에 대한 구분이 없어서 동시에 실행 가능

매크로.. 뭔지 이해가..

리습존니짱. 개좋아.

lisp계열 clojure는 몇번이나 도전을 했는데… 중도포기의 연속..

요즘 시간을 내서 작은 모듈이라도 만들어보려고 하는데 잘 될까?

Clojure 이용한 아무거나 개발

노는김에.. 클로저로 뭘 만들어보려고 하는데..
프레임워크가 필요할 것 같아서

두가지
* http://clojure-liberator.github.io/liberator/
* https://github.com/weavejester/compojure
* https://github.com/cmiles74/bishop
* Luminus – Leiningen
https://stackoverflow.com/questions/26674766/clojure-rest-api-frameworks

클로저는 문법이 희한해서 왠지 해보고 싶지 않나

빌드 툴은 Gradle을 이용. Leiningen이 표준이지만.. 공산당 같은 이름이라 안 쓰기로 했다.
최근 Gradle에서도 Clojure 플러그인이 있으니 그걸 쓰겠다.
IDE는 Intellij에서 할건데 Cursive를 깔면 좋다고 하지만.. 유료라 안깔고 쓸 것 같다.

Clojure IDE 선택

Clojure 공부 시작하려고 보니…
쓸만한 IDE가 없다.

먼 일을 해도 문구/공구 필요한거 다 챙겨놓고 시작하는 성격이고 개발툴도 찾아서 쓰는편이다.
Eclipse도 어느정도 쓸만해진 후에 Java를 시작했는데 그전에는 없었으면 시작도 안하고 그냥 VisualStudio로 윈도우만 개발만 했을 것 같은데
그래서 ruby도 php도 거들떠도 안봤었다.
python은 복잡한 프로그램을 짜는 용도로 사용하기보다 간단한 스크립트 용도로 사용했기에 상관없었지만…

Jetbrain 덕분에 사요가능 언어 범위가 많이 넓어졌다.
Ruby, Python, Php, JS …(찍어먹어보기만 했지만 Scala, Kotlin도 잘 지원을 해 주는 것 같고)

Clojure도 자동완성을 셋팅 해 놓으면 어느정도 동작을 하는 것 같은데..


{
	: user {
		: java - cmd "C:\Program Files\Java\jdk1.8.0_101\bin\java.exe": plugins[[cider / cider - nrepl "0.14.0"]]: dependencies[[org.clojure / tools.nrepl "0.2.12"]]
	}
}

겨우 지원되는게 괄호자동으로 치는기능정도인데 편집할 때 오히려 거슬릴 때도 있다.
위에 설정 추가해주면 약간 자동완성이 되는 것 같은데… 해보니 def defn 정도밖에 안된다.
코드자동완성이 잘 되면 언어 개념만 익히면 세부적으로 외우지 않고도 코딩이 가능한데
라이브러리 사용할 때도 구조만 이해하고 넘어가면 되고

설치나 빌드도..
lein 툴 이용하면 설치, 빌드도 되고 cli환경도 사용이 가능한데

다른 언어에 비해 설치방법도 불편하고 공식적으로 인정받는 설치방법도 없는 것 같다.
cli환경 실행시킬 때 쓰는 lein repl이라는 명령도 왠지 php-cli, python, 등 그냥 명령어만 실행했을 때 실행되는 것보다 거리감이 느껴진다

—- 아 IDE쓰려고 했는데 불평만 늘어놨다.

Intellij Idea + Cursive를 많이 사용하는 것 같다.

그런데 자동완성 잘 안되기는 마찬가지다.

atom, visual studio code 등 쓰는거나 별 차이가 없을지도…

그나마 오른쪽 클릭으로 바로 실행시킬 수 있는게 장점

Gradle 빌드로 자바랑 같이 쓰는 환경이나 구성 해 봐야겠다.

Clojure 언어 기본정리

1. 숫자, 분수, 소수, 사칙연산
다른 언어나 비슷하다

1+1
2/3
2/3.0
4*6
4*6.0
 

2. 괄호넣고연산
연산자가 함수로 인정

(+ 1 1)
(/ 2 3)
(/ 2 3.0)
(* 4 6)
(* 4 6.0)

3. 문자열, 키워드, 캐릭터, 불린

"bat"
:bat
\c
 
true
false

4. 컬렉션Collection – 목록형
모든 컬렉션은 Immutable, Persistent
Lisp의 벡터는 인덱스가 있고 리스트는 인덱스가 없다
List ‘(1 2 3 4) – LinkedList
Vector [1 2 3 4] – ArrayList

'(1 2 "bat" :dog)
[1 2 "bat" :dog]
(first ~)
(rest ~)
(last ~)
(count
(nth
컬렉션 합치기
(cons
(cons '(1 2) nil)
(cons '(1 2) '())
항목추가 벡터는 뒤에 리스트는 앞에
(conj

5. 컬렉션Collectino – Map
Map {:bat “bat1” “dog” “dog0”}

(get
(:bat
("dog"
(keys
(vals
값추가
(assoc ~ :cot "cot0")
값제거
(dissoc ~ :cot)
(merge

6. 컬렉션Collectino – Set
Set #{:bat “dog :cow}
합집합union
차집합difference
교집합intersection

#{:bat "dog :cow}
#{:bat "dog :cow :cow}
(require 'clojure.set)
(clojure.set/union #{:bat :dog :cow} #{:bat :rat}
(clojure.set/difference #{:bat :dog :cow} #{:bat :rat}
(clojure.set/intersection #{:bat :dog :cow} #{:bat :rat}
(get
(:bat ~)
(~ :bat)
(contains? ~ :bat)
(conj ~ :rat)
(disj ~ :rat)

7. def 변수 정의(선언)

(def bat "bat0")
(let [bat "bat0"] bat)
(let [bat "bat0" cow "cow0"] bat)
(let [bat "bat0" cow "cow0"] bat cow))
(let [bat "bat0" cow "cow0"] [bat cow])))
(let [bat "bat0" cow "cow0"] '(bat cow))

8. defn
함수정의
(defn -name [-param0 -param1] -return)

(defn bat [] "bat0")
bat
(bat)

9. fn 익명함수

(fn [] (str "bat0" "dog0"))
((fn [] (str "bat0" "dog0")))
#(str "bat0" "dog0")
(#(str "bat0" "dog0"))
(defn (fn [] (str "bat0" "dog0")))

(#(str "bat0" "dog0" %) "cow0")
(#(str "bat0" "dog0" % %) "cow0" "rat0")")
(#(str "bat0" "dog0" %0 %1) "cow0" "rat0")
(#(str "bat0" "dog0" %1 %2) "cow0" "rat0")
(#(str "bat0" "dog0" %1 %3) "cow0" "rat0")

10. ns 네임스페이스

(ns cat.house)
(def cat "cat0")
cat
(ns dog.house)

JVM기반 언어들, 쓸만한 녀석들을 골라보면

JVM은 버추어 머신으로 자바만을 돌리기 위한 플랫폼?이 아니고

자바는 컴파일시에 바이트코드를 생산하기 때문에 다른 언어들도 바이트코드로 변환할 수 있게 만들면 JVM위에서 돌릴 수 있다.

자바 처음 공부할 때 이런 내용을 본 것 같은데
그때는 뭐 컨셉만 잡아놓고 말겠지~라고 했는데

하나씩 나왔다.
jRuby, jython, … 이정도?

사실 여기까지는 쓸모없다고 느꼈었다.
네이티브로 돌리면 되는걸 왜 jvm으로 돌려~
그리고 같은 언어라고 하긴하지만… 세부 문법까지 똑같지는 않을거고
이거 복사해서 붙여넣는다고 cruby, cpython에서 돌아가는것도 아니잖아~’라고 생각했었고 지금도 그렇다.

그런데.. groovy, scala, clojure 등의 언어가 나오면서 상황이 좀 바뀐 것 같다.

groovy, scala는 spring에서도 지원하고 있고

playframework는 scala 전용프레임워크 정도로 자리를 잡은 것 같다.

이중 clojure는 … 지구의 90%이상 프로그래머가 모언어로 섬기는 C언어에 짓눌려 기를 못 펴고 있다.

scala함수형, groovy스크립트 정도로 이해하고 있는데.. 그래도 문법 자체가 c계열에서 크게 벗어난다는 느낌은 없었는데

lisp계열인 scala는… 정말 다르다.

언어의 너무 다른 컨셉때문에라도 한번 익혀놓는게 좋지 않을까 싶을정도…
그래서 clojure도 한번 해보려고 한다.

 

내 경험상… 언어를 잘 익히려면 뭔가를 만들어봐야 하는데.. clojure을 이용해서 만들만한게 뭐가 있을까 모르겠다. 언어의 특성에 따라 만들기 좋은 작품이 있는데…

몇몇 클로저 라이브러리를 보고 느낀건데… 가독성은 상당히 좋은 것 같다.
줄바꿈도 잘 지켜지고..
자바나 파이썬에서 많이 보이는 변태적인 문법도 오히려 더 적어보인다.

일단 자바기반 프로젝트에 라이브러리를 클로저로 심는 정도로 하는게 좋을 것 같다.