cider로 repl 연결하기
October 25, 2022
refs #
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 #
.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-표현식들을 실행할 수 있다.