REPL과 main

REPL과 main (The REPL and main entry points)

clojure.main 네임스페이스

clojure.main 네임스페이스는 Clojure 프로그램과 인터랙티브 세션을 Java의 애플리케이션 런처 도구 java를 통해 시작할 수 있게 해 주는 함수들을 제공해요.

출처: Clojure 공식 문서 - The REPL and main entry points

본문

clojure.main --help

clojure.main/main 진입점은 다양한 인자와 플래그를 받아요.

  • 옵션도 인자도 없으면, 인터랙티브 Read-Eval-Print Loop를 실행해요
  • init 옵션: ** -i, --init path 파일이나 리소스 로드 ** -e, --eval string 문자열의 표현식 평가; non-nil 값 출력 ** --report target 잡히지 않은 예외를 "file"(기본), "stderr", 또는 "none"으로 보고, System 속성 clojure.main.report를 덮어씀 (1.10.1에서 추가됨)
  • main 옵션: ** -r, --repl repl 실행 ** path 파일이나 리소스에서 스크립트 실행 ** - 표준 입력에서 스크립트 실행 ** -m, --main 실행할 -main 함수를 찾을 네임스페이스 ** -h, -?, --help 이 도움말 메시지 출력 후 종료
  • 연산(operation): ** 흔히 set!-가능한 var들을 위한 스레드-지역 바인딩 확립 ** user 네임스페이스 진입 ** pass:[*command-line-args*]를, 어떤 main 옵션 뒤에 나타나는 명령줄 인자를 포함하는 문자열 seq로 바인딩 ** 모든 init 옵션을 순서대로 실행 ** 요청되었다면 repl 또는 스크립트 실행

init 옵션은 반복되고 자유롭게 혼합될 수 있지만, 어떤 main 옵션보다 앞에 나타나야 해요. repl을 실행하기 전에 어떤 eval 옵션이 나타나면 보통의 repl 인사말 메시지 "Clojure ~(clojure-version)"를 억제해요.

경로는 파일시스템에서 절대 또는 상대일 수 있거나, 클래스패스에 상대적일 수 있어요. 클래스패스-상대 경로는 @ 또는 @/ 접두사를 가져요.

REPL 시작하기 (Launching a REPL)

Clojure _repl_을 시작하는 가장 간단한 방법은 clojure.main을 호출하는 <<xref/../../guides/getting_started#,clj>> 명령 도구를 사용하는 거예요:

$ clj
Clojure 1.12.0
user=>

REPL 프롬프트는 현재 네임스페이스(pass:[ns])의 이름을 보여주며, 기본은 _user_예요.

REPL을 사용할 때 몇 가지 특수 var를 사용할 수 있어요:

  • *1, *2, *3 - 마지막 세 개의 평가된 표현식 결과를 보유
  • *e - 마지막 예외의 결과를 보유

clojure.repl 네임스페이스는 사용 가능한 함수의 소스와 문서를 조사하는 유용한 함수들을 여러 개 가져요:

  • doc - 이름이 주어지면 var에 대한 docstring을 출력
  • find-doc - doc이나 이름이 패턴과 일치하는 어떤 var에 대한 docstring을 출력
  • apropos - 정규식과 일치하는 정의들의 seq를 반환
  • source - 심볼의 소스를 출력
  • pst - 주어진 예외 또는 기본으로 *e에 대한 print stack trace

스크립트 시작하기 (Launching a Script)

Clojure 코드로 가득 찬 파일을 스크립트로 실행하려면, 스크립트 경로를 clojure.main에 인자로 전달해요:

clj -M /path/to/myscript.clj

스크립트에 인자 전달하기 (Passing arguments to a Script)

스크립트에 인자를 전달하려면, clojure.main을 시작할 때 추가 인자로 전달해요:

clj -M /path/to/myscript.clj arg1 arg2 arg3

인자들은 pass:[*command-line-args*] var에 바인딩된 문자열 seq로 프로그램에 제공돼요:

*command-line-args* => ("arg1" "arg2" "arg3")

더 알아보기