KUR Creative


Clojure입문

근로저Clojure 입문 - Hello World

resource/chury1.png
근로저의 장점에 대해 하루 종일도 약을 팔 수 있지만, 그런 것보다 직접 써보게 하면서 팔아 보려 한다.

resource/chury2.png
코에 들이대지 말고 입에다 바로 쳐넣었어야지..

Linux 설치

제발 리눅스 설치해라. 두번해라. 세번해라. 농담이고 한번만 해라.

거의 모든 근로저 라이브러리나 리소스가 Unix-like 쉘에서 사용하는 것을 가정한다.
근로저는 애초에 대부분 서버용[1]으로 쓰이는 언어이기도 하고, 윈도우에서 쓰는 사람이 거의 없다.
이런 언어를 쓰는데 윈도를 고집하다 보면 윈도의 졷같은 경로나 괴상한 정책 땜에 문제가 생겨도 도와줄 수 있는 사람이 없다. 근로저만 해도 힙스턴데 그걸 윈도랑 쓰는 새끼[2]는 진짜 미친 힙스터새끼기 때문에...

그래서 다음 명령어를 어디에 집어 넣는 건지, 출력은 뭐가 나오는지 모르는 사람은 솔직히 근로저를 배울 수도 활용할 수도 없다.
$ ls -l /home

리눅스 설치해라. 요새 깃갤에서 리눅스 데탑 내려치기 하던데 모르겠고 근로저 쓸거면 인간적으로 리눅스 설치해라.
아니면 최소한 맥북이라도 써라. 근데 리눅스가 공짜니까 리눅스 설치해라.

resource/ubuntu-better-than-windows.jpg
신뢰와 믿음의 갓분투 LTS 설치해라.

rufus로 USB에 우분투 iso 이미지 박아서 부팅 디스크 만들고 컴에 USB 박아 넣고 전원 누르고 del 연타해서 BIOS 들어간 다음 USB 부팅되게 하고 껐다 켠 다음에 시키는 대로 하면 설치가 된다. 참 쉽죠?

진짜 쉬우니까 이번 기회에 리눅스 설치해 보자.
사실 나는 만자로 쓰지만... 아무튼 설치해라..

이제부터 독자는 리눅스를 쓸 수 있으며, 터미널(에뮬레이터)에서 쉘 커맨드를 실행할 줄 안다고 가정한다. 모르면 배우세요!

resource/open-in-terminal.png
참고로 (GNOME DE 기준) 파일 익스플로러에서 오른쪽 마우스키를 누르면 Open in terminal 같은 게 나오는데, 이걸 누르면 터미널 에뮬레이터에서 현재 경로의 쉘을 띄워준다.

resource/the-terminal.png
여기다 명령어를 입력하고 엔터를 누르면 쉘 커맨드를 실행할 수 있다.

Clojure 설치

배포판에서 패키지를 제공한다면 꽤끼지 매니저를 써서 Clojure를 설치할 수 있다. 만자로나 arch의 경우는 가능하다.

sudo pacman -Syu
sudo pacman -S clojure

우분투나 데비안 계열은 apt를 써야 하는데 여기는 Clojure를 패키지로 제공하진 않는 거 같다. 그러면 공홈에서 제공하는 스크립트를 써야하는데 별로 어려운 건 없다.

먼저 bash curl java rlwrap이 설치되어 있어야 한다.
근데 bash랑 curl은 보통 설치되어 있으니까 갓바랑 rlwrap만 설치하면 된다.
sudo apt-get install openjdk-11-jdk rlwrap

이제 다음을 실행하면 알아서 스크립트를 받고 설치해준다.

curl -L -O https://github.com/clojure/brew-install/releases/latest/download/linux-install.sh
chmod +x linux-install.sh
sudo ./linux-install.sh

다음 명령어를 실행했을 때 결과가 제대로 나오면 성공한 것이다
명령: clj --version
결과: Clojure CLI version 1.11.1.1208

Hello World!

REPL에서 hello world

REPL은 Read Eval Print Loop의 두문자어다. 명령을 읽고Read, 해석Eval[3]하고, 해석 결과를 출력Print하고, 이걸 반복Loop하는 프로그램이다. 다음 명령으로 근로저 REPL을 켤 수 있다.
clj

그러면 이렇게 뜬다.

Clojure 1.11.1
user=> 

프롬프트에 코드를 입력한 뒤 enter를 누르면 입력된 코드를 해석하고, 결과를 출력해 주고 다시 프롬프트를 띄운다.

user=> (println "Hello World!")
Hello World!
nil
user=> (println "안뇽안뇽")
안뇽안뇽
nil
user=> (+ 1 2 3 4)
10
user=> 

파일에서 hello world: 무작정 따라하기

최근 근로저는 동봉된 clj가 쓸만해져서 lein이나 boot 같은 서드 파티 빌드 툴 없이 clj만 써도 충분히 굴릴만 하다[4]. 내가 이 튜토리얼을 쓰게 된 이유이기도 하다.

먼저 가장 간단한 클로저 프로젝트를 만들자. 정말 별 거 없다.
src 디렉토리를 만들고 거기 .clj 파일을 추가하기만 하면 된다.

mkdir src
touch src/hello.clj

(물론 꼭 명령어 쓸 필요 없이 마우스로 해도 된다)

이제 src 아래 생성된 hello.clj에서 헬로월드를 실행할 수 있게 고쳐보자. 에디터는 아무거나 써도 된다. 다음을 입력하자. 복붙해도 된다!

(ns hello)

(defn f [opts] 
  (println "hello world"))

됐는가? tree .cat src/hello.clj 명령어 실행 결과가 다음과 같다면 된 것이다.

tree .
.
└── src
    └── hello.clj

2 directories, 1 file
cat src/hello.clj
(ns hello)

(defn f [opts] 
  (println "hello world"))

이제 다음을 실행하면 된다
clj -X hello/f

결과는 다음과 같다
hello world

파일에서 hello world: 코드 설명

방금 뭘 한거지? 하나하나 설명해 주겠다.

다른 많은 언어에서는 다음처럼 다양한 문법을 제공한다

x = 1 + 2 * b              // 계산식 statement
System.out.println("ppap") // Java 등의 메서드 호출
int f(int a, int b) {...}  // C계열 언어의 함수 정의
#define MACRO(x) ...       // C 매크로 정의
f(a, b, c)                 // C계열 언어의 함수/매크로 호출

근로저 문법은 별 게 없다. 근로저는 실행 문법으로 단! 하나! 만 제공한다

(f a b c)

이게 끝이다. C계열 함수 호출과 비슷하지만 괄호를 맨 앞에 써야 하고 쉼표를 생략할 수 있다.
그러면 우리가 작성한 코드를 해석해 보자.

(ns hello)

(defn f [opts] 
  (println "hello world"))

ns defn println은 언어가 미리 정의해둔 것들이다.

(ns hello)

ns는 현재 네임스페이스를 정의한다. ns로 현재 네임스페이스를 정의한 뒤, 네임스페이스 안에서 데이터나 함수를 정의할 수 있다.

(defn f [opts] 
  (println "hello world"))

defn은 함수를 정의한다. 위 코드는 인자 opts를 하나 받는 f라는 이름의 함수를 정의한다. 함수의 body에는 "hello world"를 출력하는 표현식이 있다.

파일에서 hello world: 실행 설명

clj는 Clojure CLI tool로, REPL과 Clojure 프로그램/표현식 실행기를 제공한다. 우리는 방금 Clojure 실행기를 써서 코드를 실행한 것이다.

clj-X 옵션을 써서 인자를 하나 받는 함수를 실행할 수 있다.
clj -X ns-name/fn-name

요약

마지막으로..

어떤가? 정말 쉽지 않은가? 하지만 원래 아무리 언어가 어려워도 헬로 월드는 쉬운 법이다..

이번에 헬로월드를 봤으니, 다음 튜토리얼에서는 실제로 프로젝트를 굴리는 법을 설명하겠다. 에디터로 코드를 작성하고, REPL에 연결하여 실행하면서 코딩하고, jar로 컴파일하여 배포하는 법 등이 되겠다.
이 때도 내가 아는 가장 간단하고 쉬운 방법, 시대에 뒤쳐지지 않은 모던한 방법과 함께 중요 개념들을 설명할 것이다.

영어를 할 줄 안다면 근로저 공식사이트 가이드 글을 정독하는 것이 큰 도움이 된다. 사실 나도 그렇게 배웠다.


  1. 근로저 창시자 힛키쿤도 딱히 의도한 건 아니지만, 자기가 해왔던 일이 서버 쪽이었기에 만들고 보니 그렇게 되었다고 한다: 'Situated' Programs, transcript ↩︎

  2. 방법이 있긴 한데 절대로 권장하지 않는다. https://github.com/clojure/tools.deps.alpha/wiki/clj-on-Windows 시작은 리눅스에서 하는 게 낫고 정말로 윈도우에서 하고 싶으면 내가 Clojure 실력이 좀 친다 싶을 때 새로운 도전으로 해보자. ↩︎

  3. Evaluate의 사전적 의미는 "평가하다"지만, 사실 REPL의 Eval은 수학적 의미에서 "값을 구하다"에 가깝다. 하지만 뉴비에게는 "해석하다"가 더 와닿을 거 같아서 이렇게 썼다. ↩︎

  4. 점점 더 많은 사람들이 서드 파티 빌드 툴이 아니라 clj를 쓰고 있다 https://clojure.org/news/2022/06/02/state-of-clojure-2022#_working_with_clojure ↩︎

#lang/clojure#tutorial튜토리얼
이전글Clojure입문다음글
kur2302130745Archivekur2302251921