cider로 repl 연결하기

cider로 repl 연결하기

October 25, 2022
emacs
cider, clojure, repl

refs #

  1. 이름공간 변경하기

clj tool로 REPL 시작하기 #

이런 deps.edn 파일이 있다고 했을 때

{:aliases   {:dev  {...}
             :test {...}}}

다음 명령어로 aliases와 함께 REPL을 실행할 수 있다.

clj -M:dev:test
# 혹은
clj -A:dev:test

Namespace 사용하기 #

clojure 프로젝트는 ns(namespace)로 스코프를 분리하고 있다. repl 환경에서 (ns dev.server) 을 실행하면 해당 ns를 만들고, 그 공간으로 넘어간다. 이 때 이전 공간에서 선언했던 이름들에는 접근할 수 없다.

user=> (def x 42)
#'user/x
user=> x
42
user=> (ns server)
nil
server=>
server=> x
Syntax error compiling at (REPL:0:0).
Unable to resolve symbol: x in this context
server=> (ns user)
nil
user=> x
42

in-ns 와 ns 의 차이점 #

in-ns가 ns에 비해 일을 좀 덜한다. in-ns는 기존에 있는 이름 공간으로 넘어가는 역할만 한다. 만약 그 공간이 없다면 하나 만들어서 넘어가긴 하는데 clojure.core에 있는 이름들을 가져오지 않는다. 그래서 defn 같은 클로저 코어 함수들을 사용할 수 없다.

그리고 문법이 조금 다르다. ns로 이름 공간을 사용할 시 작은 따옴표를 앞에 붙이지 않는다. ' 는 심볼이다.

기존에 있는 공간으로 넘어가기 #

프로젝트 내에 dev.server 라는 이름 공간이 선언되어 있다고 하자. 해당 공간에 접근하기 위해 in-ns를 사용해서 넘어가려고 했지만 새로운 공간을 선언한다.

user=> (in-ns 'dev.server)
#object[clojure.lang.Namespace 0x57dc9128 "dev.server"]
dev.server=>
dev.server=> (start! 6000)
Syntax error compiling at (REPL:1:1).
Unable to resolve symbol: start! in this context

작성되어 있는 프로그램 파일의 ns를 가져오기 위해서는 (require 'project.dev) 를 먼저 실행해줘야 한다. 그래야 해당 ns가 의존하고 있는 파일들과 해당 스코프의 이름들을 다 가져온다. 그 후에 (in-ns 'project.dev) 로 해당 이름공간으로 들어가면 그 공간에 작성되어 있는 함수들에 접근할 수 있다.

CIDER로 REPL을 실행하여 Namespace 사용하기 #

ref #

practicalli 프로젝트 설정 안내

.dir-locals.el #

프로젝트 루트에 .dir-locals.el 파일을 만든다. 이맥스가 해당 파일이 있는 프로젝트 내부의 파일을 실행할 때 여기 적힌 설정대로 구동된다. 바보같이 파일 이름을 .dir-local.el로 써서 왜 안되는지 한참 헤맸다.

clojure setting #

클로저 모드일 때 cider 설정 변수에 접근해서 바꿔준다. 앞으로 cider로 repl을 실행할 때마다 빌드 툴로 clj 를 사용하고, 함께 실행할 alias들로 dev와 test를 지정한다. 그럼 맨 위의 cli로 실행했을 때와 같이 edn 파일에 적힌 dev, test를 함께 실행해준다.

((clojure-mode . ((cider-preferred-build-tool . clojure-cli)
                  (cider-clojure-cli-aliases . ":dev:test"))))

CIDER로 코드 불러오기 #

require 단계를 단축키로 해결할 수 있다. C-c C-k (cider-load-buffer)로 현재 버퍼의 코드를 불러온다. 그 후에는 해당 스코프의 s-표현식들을 실행할 수 있다.


No notes link to this note