Clojure에서 println 어렵게 해보기

 

lamda 함수 및 "->" 연산자의 작동 방식 이해를 위해

;; 1)
(println "hello")

;; 2)
((fn [str] (println str)) "hello")

;; 3)
(-> "hello" (println))

;; 4)
(-> "hello" ((fn [str] (println str))))
,

특정 경로에서 커맨드창을 실행하기 위해서는

 

- 일반적인 환경에서는 시작 메뉴에 있는 명령 프롬프트 단축아이콘을 복사한 뒤 시작 위치 속성을 바꾸는 방법을 사용합니다.

 

- 다음과 같은 배치 파일 코드는 특수한 조건에서만 동작합니다. (파이썬의 subprocess.Popen으로 실행했을 때라던가..)

D:
cd \work

 

,

여러 개의 배치파일을 각각의 커맨드창에서 실행하기 위한 배치파일입니다.

 

multi.bat

<경로 변경 커맨드>
start batch1.bat
start batch2.bat

,
Clojure에서 키워드는 앞에 :이 붙은 요소인데, 설명을 읽어봐도 잘 이해가 되지 않으므로 사용용도를 통해 그 정체를 기억하자.


맵의 이름은 함수처럼 사용해서 데이터를 참조하는 것이 가능한데, 키워드를 키로 지정할 경우, 이 키워드도 함수처럼 사용하는 것이 가능하다. (다른 맵 간에 키워드 중복 사용도 무방)



맵 정의

(def planet {:name "earth" :type "terrestrial"
        :satelite {:sateliteName "moon" :alternateName "luna"}})


데이터 참조

; 아래 세 구문 모두 같은 값 "terrestrial"을 갖는다.

(planet :type)
(get planet :type)
(:type planet)  ; 만약 키가 "type"(문자열)이라면, 이런 식의 사용은 불가능하다.

-> "terrestrial"


연쇄 참조

; 아래 세 구문 모두 같은 값 "luna"을 갖는다.

(:alternateName (:satelite planet))
(-> planet :satelite :alternateName)
(get-in planet [:satelite :alternateName])

-> "luna"


키가 존재하지 않을 경우

; 존재하지 않는 키인 키워드를 사용할 경우 nil을 반환한다.

(:orbit planet)

-> nil


키워드에 네임스페이스 사용

; / 기호를 사용해 키워드에 네임스페이스를 줄 수도 있다.

(:etc/alternateName {:name/sateliteName "moon" :etc/alternateName "luna"})

-> "luna"


<테스트 환경>
- OS : Windows 10
- Leiningen 버전 : 1.0.0
,

Clojure 활용의 핵심! 자바 클래스 사용방법에 대해 정리해보았습니다.

 

 

클래스 import

; 풀네임으로 쓰는 방법
java.util.Date  ; => java.util.Date


; 줄여서 쓰는 방법
(import java.util.Date)
Date  ; => java.util.Date

 

자동 import

; java.lang 밑에 있는 클래스들은 별도의 import 없이 줄여쓰는 방법으로 쓸 수 있다
Math  ; => java.lang.Math
String  => java.lang.String

 

이너(Inner) 클래스 import

; 풀네임으로 쓰는 방법
java.util.Map$Entry  ; => java.util.Map$Entry


; 줄여서 쓰는 방법
(import java.util.Map$Entry)
Map$Entry  ; => java.util.Map$Entry

 

인스턴스 생성

; new 구문을 사용
(new java.util.Date)

; 약식 구문
(java.util.Date.)

; 약식 구문 (import 후)
(import java.util.Date)
(Date.)

; 생성자 파라미터 전달하는 경우
(java.net.URI. "http://clojure.org")

 

인스턴스 메소드 호출

; . 구문을 사용
(let [d (java.util.Date.)]
  (. d getTime))

; 약식 구문
(let [d (java.util.Date.)]
  (.getTime d))

 

정적 메소드 호출

; . 구문을 사용
(. Math floor 5.677)

; 약식 구문
(Math/floor 5.677)

 

연쇄 호출

(.. (java.util.Date.) getTime toString)  ; (-> (java.util.Date.) (. getTime) (. toString)) 과 동일
                                         ; (-> (java.util.Date.) (.getTime) (.toString)) 과도 동일

 

동일 오브젝트에 복수 호출

(doto (java.util.Stack.)
  (.push 42)
  (.push 13)
  (.push 7))  ; 첫번째 파라미터의 오브젝트가 나머지 호출의 첫번째 파라미터로 들어간다

; 아래와 같이 써도 동일
(doto (java.util.Stack.)
  (. push 42)
  (. push 13)
  (. push 7))

 

자바 필드(멤버 변수) 읽기

; . 구문을 사용
(let [pt (java.awt.Point. 10 20)]
(. pt x))  ; pt.x를 읽음

; 약식 구문
(let [pt (java.awt.Point. 10 20)]
(.x pt))

 

자바 필드(멤버 변수) 쓰기

(let [pt (java.awt.Point. 10 20)]
  (set! (.y pt) 100))  ; pt.y -> 100으로 세팅됨

 

Enum 타입 사용

java.util.concurrent.TimeUnit/MILLISECONDS

 

상수/인스턴스의 자바 클래스 얻기

(class 1)       ; => java.lang.Long
(class "docs")  ; => java.lang.String
(class (java.net.URI. "http://github.com"))  ; => java.net.URI

 

클래스명으로 클래스 얻기

(Class/forName "java.util.Date")  ; => java.util.Date

 

참고: http://clojure-doc.org/articles/language/interop.html

<테스트 환경>
- OS : Windows 10
- Leiningen 버전 : 1.0.0

 

,