Home [Clojure] Building, Running, and the REPL
Post
Cancel
Preview Image

[Clojure] Building, Running, and the REPL

현재 Java, Clojure version 기록용

1
2
3
4
5
6
7
$ java --version
openjdk 17.0.2 2022-01-18
OpenJDK Runtime Environment Temurin-17.0.2+8 (build 17.0.2+8)
OpenJDK 64-Bit Server VM Temurin-17.0.2+8 (build 17.0.2+8, mixed mode)

$ clj --version
Clojure CLI version 1.10.3.1087

IDE는 뭘로 하지

가장 중요한 부분이다.

검색해보니 다양한 옵션들이 존재하는데, 크게 눈이 가는 두 가지 옵션은 아래와 같다.

일단 두 개 모두 설치했다. 나중에 필요없는걸 지우는 방법으로!

당장은 생각없이 VSCode + Calva Extension 로 진행하겠다!

Leiningen

오늘날 대부분의 Clojurists는 Leiningen 를 사용하는 듯하다. (라고 적혀있다)

  • Clojurists라니… 이름 멋지다 😎

아래와 같은 일을 해준다고 한다.

  1. Creating a new Clojure project
  2. Running the Clojure project
  3. Building the Clojure project
  4. Using the REPL

홈페이지는 https://leiningen.org/ 이다.

공식 홈페이지에서는 스크립트를 다운로드 받고, 별도로 PATH 설정 후 사용하라고 되어있는데,

homebrew를 찾아보니 잘 있어서 그냥 brew로 설치해보겠다.

1
2
3
$ brew install leiningen
$ lein --version
Leiningen 2.9.8 on Java 17.0.2 OpenJDK 64-Bit Server VM

새로운 Project 만들기

너무 다양한 옵션이 있는 것 같은데, 일단 하나도 모르겠고

https://www.braveclojure.com/getting-started/ 을 따라가면서 만들어보겠다.

1
2
$ lein new app learning-clojure
Generating a project called learning-clojure based on the 'app' template.

그럼 아래와 같이 생긴다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ tree .
.
├── CHANGELOG.md
├── LICENSE
├── README.md
├── doc
│   └── intro.md
├── project.clj
├── resources
├── src
│   └── learning_clojure
│       └── core.clj
└── test
    └── learning_clojure
        └── core_test.clj

6 directories, 7 files

Clojure Project 실행하기

/src/learning-clojure/core.clj 파일을 보면 아래와 같다.

1
2
3
4
5
6
7
8
(ns learning-clojure.core
  (:gen-class))

#_{:clj-kondo/ignore [:unused-binding]} ; <- 이 라인은 VSCode에서 린트때문에 추가해줬다.
(defn -main
  "I don't do a whole lot ... yet."
  [& args]
  (println "Hello, World!"))

이제 아래와 같이 lein run 을 통해서 실행하면 아래와 같다.

1
2
$ lein run
Hello, World!

만약, /src/learning-clojure/core.clj 파일에서 (println "Hello, World!")) 라인을 마음대로 바꿔서 다시 lein run 을 실행하면 아래와 같이 바뀐다.

1
2
3
4
5
6
7
8
(ns learning-clojure.core
  (:gen-class))

#_{:clj-kondo/ignore [:unused-binding]}
(defn -main
  "I don't do a whole lot ... yet."
  [& args]
  (println "Hello, World! in VSCode"))
1
2
$ lein run
Hello, World! in VSCode

Clojure Project Building하기

lein run 으로 실행하면, 어느 누구도 같은 코드로 같은 실행 결과를 얻을 수 있지만,

Leiningen 가 설치되어 있지 않은 사람과 같이 일할 경우에는 어떻게 해야할까?

이럴 때를 위해서 자바가 설치되어 있는 사람들에게 실행 가능한 파일을 생성해줘야 한다.

그렇게 하기 위해서 아래와 같이 실행해주면 된다.

1
$ lein uberjar

왜 uberjar 일까? 다른 XXXjar는 안되나?

안된다. 그냥 명령어이다. https://github.com/technomancy/leiningen/blob/stable/doc/TUTORIAL.md#uberjar 뭔 우버인가 싶었는데 다~ 의미가 있는 것이었다.

궁금해서 help 쳐보면 잘 나온다.

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
$ lein help
Leiningen is a tool for working with Clojure projects.

Several tasks are available:
change              Rewrite project.clj with f applied to the value at key-or-path.
check               Check syntax and warn on reflection.
classpath           Write the classpath of the current project to output-file.
clean               Removes all files from paths in clean-targets for a project
compile             Compile Clojure source into .class files.
deploy              Deploy jar and pom to remote repository.
deps                Download and examine dependencies.
do                  Higher-order task to perform other tasks in succession.
help                Display a list of tasks or help for a given task or subtask.
install             Install jar and pom to the local repository; typically ~/.m2.
jar                 Package up all the project's files into a jar file.
javac               Compile Java source files.
new                 Generate scaffolding for a new project based on a template.
plugin              DEPRECATED. Please use the :user profile instead.
pom                 Write a pom.xml file to disk for Maven interoperability.
release             Perform release tasks.
repl                Start a repl session either with the current project or standalone.
retest              Run only the test namespaces which failed last time around.
run                 Run the project's -main function.
search              Search Central and Clojars for published artifacts.
show-profiles       List all available profiles or display one if given an argument.
test                Run the project's tests.
trampoline          Run a task without nesting the project's JVM inside Leiningen's.
uberjar             Package up the project files and all dependencies into a jar file.
update-in           Perform arbitrary transformations on your project map.
upgrade             Upgrade Leiningen to specified version or latest stable.
vcs                 Interact with the version control system.
version             Print version for Leiningen and the current JVM.
with-profile        Apply the given task with the profile(s) specified.

Run `lein help $TASK` for details.

Global Options:
  -o             Run a task offline.
  -U             Run a task after forcing update of snapshots.
  -h, --help     Print this help or help for a specific task.
  -v, --version  Print Leiningen's version.

These aliases are available:
downgrade, expands to upgrade

See also: readme, faq, tutorial, news, sample, profiles, deploying, gpg,
mixed-source, templates, and copying.

아무튼 실행해보면 아래와 같다.

1
2
3
4
$ lein uberjar
Compiling learning-clojure.core
Created /Users/bossm0n5t3r/gitFolders/learning-clojure/target/uberjar/learning-clojure-0.1.0-SNAPSHOT.jar
Created /Users/bossm0n5t3r/gitFolders/learning-clojure/target/uberjar/learning-clojure-0.1.0-SNAPSHOT-standalone.jar

target/ 밑에 뭔가 생겼다. 확인해보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ tree target
target
└── uberjar
    ├── classes
    │   ├── META-INF
    │   │   └── maven
    │   │       └── learning-clojure
    │   │           └── learning-clojure
    │   │               └── pom.properties
    │   └── learning_clojure
    │       ├── core$_main.class
    │       ├── core$fn__173.class
    │       ├── core$loading__6737__auto____171.class
    │       ├── core.class
    │       └── core__init.class
    ├── learning-clojure-0.1.0-SNAPSHOT-standalone.jar
    ├── learning-clojure-0.1.0-SNAPSHOT.jar
    └── stale
        └── leiningen.core.classpath.extract-native-dependencies

8 directories, 9 files

java로 실행하려면 아래와 같이 하면 된다.

1
2
$ java -jar target/uberjar/learning-clojure-0.1.0-SNAPSHOT-standalone.jar
Hello, World!

음~ 잘 된다.

REPL 사용하기

REPL이 뭔지는 아직도 모른다.

나중에 더 자세히 알아보도록 하고, 실행하려면 아래와 같이 실행하면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
$ lein repl
nREPL server started on port 50880 on host 127.0.0.1 - nrepl://127.0.0.1:50880
REPL-y 0.5.1, nREPL 0.8.3
Clojure 1.10.3
OpenJDK 64-Bit Server VM 17.0.2+8
    Docs: (doc function-name-here)
          (find-doc "part-of-name-here")
  Source: (source function-name-here)
 Javadoc: (javadoc java-object-or-class-here)
    Exit: Control+D or (exit) or (quit)
 Results: Stored in vars *1, *2, *3, an exception in *e

learning-clojure.core=>

시간이 조금 걸렸다.

이제 learning-clojure.core=> 뒤에 이미 정의된 함수를 넣어주면 실행된다.

아까의 main 함수를 정의했으므로, 해당 함수를 넣어주면 다음과 같이 실행된다.

1
2
3
learning-clojure.core=> (-main)
Hello, World!
nil

아래와 같이 Clojure의 기본 함수들도 실행할 수 있다.

1
2
3
4
5
6
learning-clojure.core=> (+ 1 2 3 4)
10
learning-clojure.core=> (* 1 2 3 4)
24
learning-clojure.core=> (first [1 2 3 4])
1

또 다음과 같이도 실행 가능하다.

1
2
3
4
learning-clojure.core=> (do (println "no prompt here!")
                   #_=> (+ 1 3))
no prompt here!
4

종료할 때는 Ctrl + D, (exit), (quit) 중 하나만 하면 된다.

1
2
learning-clojure.core=> (exit)
Bye for now!

Next

Part II: Language Fundamentals 부터 시작하겠다.

References

This post is licensed under CC BY 4.0 by the author.

[Clojure] macOS에 Clojure 설치하기

[Clojure] Do Things: A Clojure Crash Course