맨위로가기

클로저 (프로그래밍 언어)

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

클로저는 리치 히키가 개발한 범용 프로그래밍 언어이자, Lisp의 방언이다. 함수형 프로그래밍을 지원하며, 자바 가상 머신 위에서 실행되어 자바와의 상호 운용성을 제공한다. 2007년 10월에 공개되었으며, 동시성 프로그래밍을 위한 기능을 갖추고 있다. 클로저는 클로저, ClojureCLR, ClojureScript 등 다양한 변형과 구현체를 가지고 있으며, Emacs, IntelliJ IDEA, Visual Studio Code 등 다양한 개발 도구를 지원한다.

더 읽어볼만한 페이지

  • 2007년 개발된 프로그래밍 언어 - Agda
    Agda는 찰머스 공과대학교에서 개발된 의존형 타입 이론 기반의 프로그래밍 언어이자 증명 지원 시스템으로, 유니코드 지원, Emacs 모드, 종료 검사, 자동화 기능, 그리고 Haskell 및 JavaScript 컴파일러 백엔드를 제공한다.
  • 2007년 개발된 프로그래밍 언어 - Nu (프로그래밍 언어)
    Nu는 Objective-C, Lisp, 루비의 영향을 받아 설계되었으며, 한국 소프트웨어 산업의 혁신에 기여할 잠재력을 가진 프로그래밍 언어이다.
  • 리스프 프로그래밍 언어 계열 - 커먼 리스프
    커먼 리스프는 1980년대 초 여러 리스프 방언 통합 시도에서 시작된 언어로, S-표현식 문법, 다양한 자료형, 일급 함수, 매크로, CLOS를 특징으로 하며, ANSI 표준으로 정의되어 다양한 분야에서 활용된다.
  • 리스프 프로그래밍 언어 계열 - 딜런 (프로그래밍 언어)
    딜런은 애플에서 개발되어 오픈 소스화된 동적 프로그래밍 언어로, Lisp의 영향, 다중 상속, 제네릭 함수 등의 특징과 높은 확장성을 제공한다.
  • 소스 대 소스 컴파일러 - 스칼라 (프로그래밍 언어)
    스칼라는 마틴 오더스키가 설계한 객체 지향 및 함수형 프로그래밍 언어이며, 자바 플랫폼에서 실행되고 자바 코드와 상호 운용이 가능하며, 아파치 스파크 등 다양한 곳에서 활용된다.
  • 소스 대 소스 컴파일러 - 타입스크립트
    타입스크립트는 마이크로소프트에서 개발한 자바스크립트의 상위 집합으로, 정적 타입 지정, 타입 추론 등의 기능을 제공하여 코드의 안정성과 가독성을 높이는 언어이다.
클로저 (프로그래밍 언어) - [IT 관련 정보]에 관한 문서
기본 정보
Clojure 로고
Clojure 로고
패러다임함수형
멀티 패러다임
설계 정보
설계자리치 히키
발표 연도2007년
최신 버전1.11.2
최신 버전 발표일2024년 3월 8일
자료형동적
강한
메모리 관리가비지 컬렉션 (호스트를 통해: JVM, CLR, 자바스크립트 런타임 (ClojureScript의 경우 V8), BEAM)
방언ClojureScript
ClojureDart
영향을 받은 언어C#
C++
커먼 리스프
Erl랑
하스켈
자바
ML
프롤로그
라켓
루비
스키마
울프람 언어
영향을 준 언어엘릭서
Hy
Janet
LFE
Pixie
Rhine
플랫폼자바
자바스크립트
.NET
라이선스이클립스 퍼블릭 라이선스
웹사이트Clojure 공식 웹사이트
파일 확장자.clj
.cljs
.cljr
.cljc
.cljd
.edn
특징
유형 체계동적
강한
동시성 모델에이전트 지향
병행
주요 특징함수형
논리
매크로
파이프라인
ClojureCLR 정보
발표 연도2010년
최신 버전1.11.0
최신 버전 발표일2022년 8월 22일
플랫폼.NET
라이선스이클립스 퍼블릭 라이선스
웹사이트ClojureCLR GitHub

2. 역사

리치 히키는 클로저 프로그래밍 언어의 창시자이다.[18] 클로저 이전에 그는 .NET 기반의 비슷한 프로젝트인 [http://dotlisp.sourceforge.net/dotlisp.htm DotLisp]을 개발했다.[26] 또한, Lisp와 자바 간의 상호 운용성을 제공하기 위해 'Common Lisp를 위한 자바 외국어 인터페이스'(`jfli`),[27] 'Lisp를 위한 외국 객체 인터페이스'(FOIL),[28] '자바 서블릿을 위한 Lisp 친화적 인터페이스'(Lisplets)와 같은 세 가지 프로젝트를 시도했다.[29]

리치 히키는 2007년 10월에 클로저를 공개하기 전 약 2년 반 동안 클로저 개발에 매달렸는데, 이 기간 동안 대부분 외부 자금 지원 없이 클로저에만 전념했다. 개발 기간이 끝날 무렵, 그는 Common Lisp 커뮤니티의 친구들에게 이 언어를 알리는 이메일을 보냈다.

히키에 따르면 클로저라는 이름은 프로그래밍 개념인 "클로저"에 대한 언어 유희이며, C#, Lisp, 자바 ஆகிய 세 언어의 글자(C, L, J)를 조합하여 만들었다고 한다.[17]

리치 히키, 클로저 창시자

2. 1. 개발 배경

리치 히키는 자바 플랫폼과 공존하면서 동시성을 잘 처리할 수 있는 현대적인 Lisp을 원했다. 클로저 이전에 그는 .NET 기반의 DotLisp 프로젝트를 개발하기도 했다.[26]

그는 또한 'Common Lisp를 위한 자바 외국어 인터페이스'(`jfli`),[27] 'Lisp를 위한 외국 객체 인터페이스'(FOIL),[28] '자바 서블릿을 위한 Lisp 친화적 인터페이스'(Lisplets) 등 Lisp와 자바 간의 상호 운용성을 제공하기 위한 세 가지 프로젝트를 진행했다.[29]

클로저 개발에는 2년 반이 걸렸으며, 이 기간 동안 리치 히키는 외부 자금 지원 없이 클로저 개발에 전념했다. 그는 2007년 10월에 클로저를 공개적으로 출시했으며, 개발 기간이 끝날 무렵 커먼 리스프 커뮤니티의 몇몇 친구들에게 이 언어를 알리는 이메일을 보냈다.

2. 2. 초기 역사

리치 히키는 클로저 프로그래밍 언어의 창시자이다.[18] 클로저 이전에 그는 .NET 기반의 비슷한 프로젝트인 [http://dotlisp.sourceforge.net/dotlisp.htm DotLisp]을 개발했다.[26]

히키는 2007년 10월에 클로저를 공개적으로 출시하기 전 약 2년 반 동안 클로저 작업에 매달렸으며, 이 기간의 대부분은 외부 자금 지원 없이 클로저에만 전념했다. 이 기간이 끝날 무렵, 히키는 Common Lisp 커뮤니티의 몇몇 친구들에게 이 언어를 알리는 이메일을 보냈다. 클로저 개발과 공개에는 2년 반이 걸렸는데, 이 기간 동안 그는 외부 기금없이 거의 클로저에만 전념했다.

히키에 따르면 클로저라는 이름은 프로그래밍 개념인 "클로저"에 대한 언어 유희이며, 클로저 설계에 큰 영향을 미친 세 언어인 C#, Lisp, 자바의 문자인 C, L, J를 조합하여 만들었다고 한다.[17]

2. 3. 릴리스 역사

버전출시일주요 기능, 개선 사항
[30]최초 공개 릴리스
1.0[112]최초 안정 릴리스
1.1[113]퓨처
1.2[114]프로토콜
1.3[115]향상된 기본 지원
1.4[116]리더 리터럴
1.5[117]리듀서
1.5.1[118]메모리 누수 수정
1.6[119]자바 API, 향상된 해싱 알고리즘
1.7[120]트랜스듀서, 리더 조건문
1.8[121]추가적인 문자열 함수, 직접 링크, 소켓 서버
1.9[122]스펙과의 통합, 명령줄 도구
1.10[123]개선된 오류 보고, 자바 호환성
1.10.1[124]자바 성능 회귀 문제 해결 및 clojure.main의 오류 보고 개선
1.10.2[125]자바 상호 운용성/호환성 개선 및 기타 중요한 언어 수정
1.10.3[126]리더 조건문에 대한 prepl 지원
1.11.0[127]키워드 인자 호출을 위한 새로운 구문, 새로운 clojure.math 네임스페이스, 로드 없이 네임스페이스 별칭 지정, clojure.core에 추가된 새로운 헬퍼 함수
1.11.1[128]clojure.lang.Keywordclojure.lang.ArraySeq 유형의 객체 이진 직렬화에서 의도하지 않은 변경 사항 롤백
1.11.2[129][https://nvd.nist.gov/vuln/detail/CVE-2024-22871 CVE-2024-22871] 서비스 거부 취약점 수정
1.12.0[130]자바 메서드 값, 파람 타입 힌트, 배열 클래스 구문, add-lib, clojure.java.process


3. 철학 및 설계

리치 히키는 함수형 프로그래밍이 가능하면서 자바 플랫폼과 공존하고 동시성을 잘 처리하는 현대적인 리스프를 만들고자 클로저를 개발했다.[137][138]

클로저의 동시성 접근 방식은 동일성(identity) 개념으로 특징지어진다. 이는 시간의 흐름에 따라 나열된 불변하는 상태들의 계열로 나타낼 수 있다. 상태는 불변값이기 때문에 작업자가 아무리 많아도 동시에 그들을 다룰 수 있게 되어, 동시성은 한 상태에서 다른 상태로의 이동을 다루는 문제가 된다. 이를 위해 클로저는 몇 개의 참조 타입을 제공하는데, 이들은 각각 상태 간 전이에 대한 잘 정의된 범주를 갖는다.[22]

3. 1. 함수형 프로그래밍

리치 히키는 자바 플랫폼에서 실행되며 동시성 처리가 가능한 현대적인 리스프 기반 함수형 프로그래밍 언어를 만들기 위해 클로저를 개발했다.[137][138]

클로저는 순수 함수와 불변 데이터 구조를 사용하여 부작용을 최소화하고 안정성을 높인다. 반복문 대신 재귀고차 함수를 활용한다. JVM은 기본적으로 꼬리 호출 최적화를 지원하지 않기 때문에, `recur` 키워드를 사용하여 명시적으로 꼬리 재귀를 구현해야 한다.[41][42][43][44]

클로저는 함수를 일급 객체로 취급하며, read–eval–print loop 및 매크로 시스템을 지원한다.[6]

3. 2. 동시성

리치 히키(Rich Hickey)는 기존의 자바 플랫폼에서 작동하며 병렬 컴퓨팅이 가능한 함수형 Lisp 계열의 언어를 만들기 위해 클로저를 설계했다.[23][24][31][16]

클로저의 동시성에 대한 접근은 동일성(identity) 개념으로 특징지을 수 있는데, 이것은 시간의 흐름에 따라 나열된 불변하는 상태들의 계열로 나타낼 수 있다. 상태는 불변값이기 때문에 작업자가 아무리 많아도 동시에 그들을 다룰 수 있게 되어, 동시성은 한 상태에서 다른 상태로의 이동을 다루는 문제가 된다. 이를 위해 클로저는 여러 개의 변경 가능한 참조 타입을 제공하며, 각 타입은 상태 간의 전환에 대한 잘 정의된 의미를 갖는다.[22]

클로저는 소프트웨어 트랜잭션 메모리,[45] 반응형 에이전트 시스템,[1] 및 채널 기반 동시 프로그래밍을 제공한다.[46]

다음은 클로저 언어의 소프트웨어 트랜잭션 메모리를 사용한 예시이다. 10개의 값이 들어있는 길이 100의 배열(vector)이 있으며, 10×100=1,000개의 서로 다른 연속된 수가 저장되어 있다. 이 100개의 vector를 16개의 스레드로 공유한다. 각 스레드는 무작위로 2개의 vector를 선택하고, 각 배열에서 무작위 위치를 결정하여 두 배열의 요소 내용을 교환하는 작업을 수행한다. 이 작업을 300,000번 반복해도 처음에 저장되었던 1,000개의 수는 하나도 손실되지 않는다.

```lisp

(defn run [nvecs nitems nthreads niters]

(let [vec-refs (vec (map (comp ref vec)

(partition nitems (range (* nvecs nitems)))))

swap #(let [v1 (rand-int nvecs)

v2 (rand-int nvecs)

i1 (rand-int nitems)

i2 (rand-int nitems)]

(dosync

(let [temp (nth @(vec-refs v1) i1)]

(alter (vec-refs v1) assoc i1 (nth @(vec-refs v2) i2))

(alter (vec-refs v2) assoc i2 temp))))

report #(do

(prn (map deref vec-refs))

(println "Distinct:"

(count (distinct (apply concat (map deref vec-refs))))))]

(report)

(dorun (apply pcalls (repeat nthreads #(dotimes [_ niters] (swap)))))

(report)))

(run 100 10 16 300000)

3. 3. 자바 플랫폼과의 공생

리치 히키가 클로저를 만든 이유는 함수형 프로그래밍이 가능하면서 자바 플랫폼과 공존하고 동시성을 잘 처리하는 현대적인 Lisp를 원했기 때문이다.[137][138]

클로저는 Java 플랫폼에서 실행되므로 Java와 통합되어 클로저에서 Java 코드를 호출하는 것을 완전히 지원하며,[35][16] Java에서도 클로저 코드를 호출할 수 있다.[36]

4. 문법

다른 리스프와 같이, 클로저의 문법은 S-표현식에 기반하는데, 구문이 컴파일되기 전에 먼저 리더에 의해 파싱되어 데이터로 바뀐다. 클로저의 리더는 , 집합, 벡터, 리스트를 위한 리터럴 문법을 지원하며, 이들은 컴파일러에 그 자체로 주어진다. 클로저는 Lisp-1이며, 다른 리스프 방언들과 코드 호환이 되도록 만들어지지 않았다.[1]

4. 1. S-표현식

다른 LISP 계열 언어와 마찬가지로, Clojure영어 언어 프로그램은 S식으로 표현된다. 프로그램 코드는 컴파일되기 전에 ''리더''에 의해 분석되어 내부 데이터 구조로 변환된다. Clojure영어 언어의 리더는 리스트 외에도 배열, 해시 테이블, 집합도 리터럴 표현으로 취급할 수 있으며, 그대로 컴파일러에 전달된다. 다시 말해, Clojure영어의 컴파일러는 리스트뿐만 아니라 위에 언급한 모든 데이터 구조를 직접 처리할 수 있다는 것이다. Clojure영어 언어는 Lisp-1이며, 함수 이름과 변수 이름은 동일한 네임스페이스에 있고, 다른 LISP 계열 언어와의 코드 호환성은 고려되지 않았다.

4. 2. 데이터 구조

다른 리스프와 마찬가지로, 클로저의 문법은 S-표현식에 기반하는데, 구문이 컴파일되기 전에 먼저 리더에 의해 파싱되어 데이터로 바뀐다. 클로저의 리더는 , 집합, 벡터, 리스트를 위한 리터럴 문법을 지원하며, 이들은 컴파일러에 그 자체로 주어진다. 다시 말해, 클로저 컴파일러는 리스트 데이터 구조뿐만 아니라 위에서 언급한 모든 데이터 구조를 직접 지원한다. 클로저는 Lisp-1이며, 다른 리스프 방언들과 코드 호환이 되도록 만들어지지 않았다.

4. 3. 매크로

클로저의 매크로 시스템은 Common Lisp와 유사하지만, 변수 캡처를 방지하기 위해 기호를 해당 네임스페이스로 한정한다. 클로저는 Lisp-1영어으로, 함수와 변수가 동일한 네임스페이스를 사용한다. Clojure영어 언어의 매크로 기구는 Common Lisp의 그것과 매우 유사하다. 단, Clojure영어 언어의 백쿼트 (「구문 쿼트」라고 불린다)에서는, 개개의 기호가 국소적인 네임스페이스에 의해 구별된다는 점에서 Common Lisp영어의 매크로와는 다르다. 이 기구를 통해, 매크로 전개 시 변수의 포획(= 매크로가 전개된 환경에 동명의 변수가 있으면, 그 변수의 값이 변경되어 버리는 것)을 피하고 있다. 매크로 전개 시 변수의 포획을 허용하도록 강제하는 것도 가능하지만, 그것은 명시적으로 행해야 한다. 또한, Clojure영어 언어에서는, 현재 네임스페이스에 임포트된 다른 네임스페이스의 대역명을 변경하는 것은 허용되지 않는다.

5. 언어 기능

클로저는 다음과 같은 주요 기능을 제공한다.



리치 히키는 함수형 프로그래밍을 위한 현대적인 Lisp, 기존의 Java 플랫폼과 공생하며, 동시성을 위해 설계된 클로저를 개발했다.[23][24][31][16] 그는 프로그래밍 언어 설계와 소프트웨어 아키텍처의 단순성을 강조하며, 느슨한 결합, 상속 대신 프로토콜과 타입 클래스를 통한 다형성, 메서드나 구문을 데이터로 대체 대신 네임스페이스된 상태가 없는 함수를 옹호했다.[32][33][34]

Lisp 방언으로서 클로저는 함수를 일급 객체로 지원하며, read–eval–print loop(REPL) 및 매크로 시스템을 지원한다.[6] 클로저의 Lisp 매크로 시스템은 Common Lisp와 매우 유사하지만, 클로저 버전의 백쿼트(구문 쿼트)는 기호를 해당 네임스페이스로 한정한다. 이는 네임스페이스 한정 이름에 대한 바인딩이 금지되어 의도하지 않은 이름 캡처를 방지하는 데 도움이 된다. 캡처 매크로 확장을 강제하는 것은 가능하지만 명시적으로 수행해야 한다. 클로저는 사용자 정의 리더 매크로를 허용하지 않지만, 리더는 더 제한된 형태의 구문 확장을 지원한다.[37]

클로저는 지연 시퀀스를 지원하며 불변 객체 및 영구적 자료 구조의 원칙을 장려한다. 함수형 언어로서 재귀고차 함수가 부작용 기반 루핑보다 더 강조된다. JVM이 기본적으로 지원하지 않으므로 자동 꼬리 호출 최적화는 지원되지 않으며,[41][42][43] `recur` 키워드를 사용하여 명시적으로 수행할 수 있다.[44] 병렬 및 동시 프로그래밍을 위해 클로저는 소프트웨어 트랜잭션 메모리,[45] 반응형 에이전트 시스템,[1] 및 채널 기반 동시 프로그래밍을 제공한다.[46]

클로저 1.7은 동일한 네임스페이스에 클로저, ClojureScript 및 ClojureCLR 코드를 임베딩할 수 있도록 함으로써 리더 조건을 도입했다.[120][20] Transducer는 변환을 구성하는 방법으로 추가되었다. Transducer를 사용하면 mapfold와 같은 고차 함수가 모든 입력 데이터 소스에 대해 일반화될 수 있다. 전통적으로 이러한 함수는 시퀀스에서 작동하지만, transducer를 사용하면 채널에서 작동할 수 있으며 사용자가 자신의 변환 모델을 정의할 수 있다.[47][48][49]

5. 1. JVM 바이트코드 생성

클로저 응용 프로그램은 자바 가상 머신(JVM) 바이트코드로 컴파일되므로, 별다른 복잡한 과정 없이 JVM 환경이나 자바 애플리케이션 서버 환경에 배포할 수 있다.[1] 언어 차원에서 자바 API를 쉽게 사용할 수 있는 매크로도 제공한다.[1] 클로저의 데이터 구조는 모두 자바 표준 인터페이스를 구현하고 있어, 클로저에서 구현된 코드를 자바 코드에서 실행하기도 쉽다.[1]

5. 2. 자바와의 통합

클로저는 자바와 밀접하게 통합되어 있다. 클로저 응용 프로그램은 자바 가상 머신(JVM) 바이트코드로 컴파일되므로, JVM 환경이나 애플리케이션 서버 환경에 복잡한 과정 없이 배포할 수 있다. 또한, 자바 API를 쉽게 사용할 수 있는 매크로를 언어 차원에서 제공한다. 클로저의 데이터 구조는 모두 자바의 표준 인터페이스를 구현하고 있어, 클로저 코드를 자바 코드에서 실행하기도 용이하다.

5. 3. REPL 환경

클로저는 REPL 환경을 제공하여 빠른 개발과 실험을 지원한다. 대화형 평가 환경을 통해 동적 개발이 가능하다.

5. 4. 함수형 프로그래밍 지원

리치 히키가 클로저를 만든 것은 함수형 프로그래밍이 가능하면서 자바 플랫폼과 공존하고 동시성을 잘 처리하는 현대적인 리스프를 원했기 때문이다.[137][138]

클로저는 다음과 같은 함수형 프로그래밍 기능을 지원한다.

클로저의 상태에 대한 접근 방식은 시간이 지남에 따라 일련의 불변 상태로 표현되는 아이덴티티의 개념으로 특징지어진다.[22] 상태는 불변 값이므로 임의의 수의 작업자가 병렬로 작동할 수 있으며, 동시성은 한 상태에서 다른 상태로 변경을 관리하는 문제가 된다. 이를 위해 클로저는 여러 개의 변경 가능한 참조 타입을 제공하며, 각 타입은 상태 간의 전환에 대한 잘 정의된 의미를 갖는다.[22]

5. 5. 동시성 프로그래밍 지원

Clojure영어소프트웨어 트랜잭셔널 메모리, 에이전트 시스템, 동적 변수 시스템 등을 통해 동시성 프로그래밍을 지원한다.[22] 이는 시간이 지남에 따라 일련의 불변 상태로 표현되는 아이덴티티 개념으로 특징지어지며, 상태는 불변 값이므로 임의의 수의 작업자가 병렬로 작동할 수 있다.[22] 동시성은 한 상태에서 다른 상태로 변경을 관리하는 문제가 된다.[22]

다음은 클로저의 소프트웨어 트랜잭셔널 메모리를 사용한 예시이다. 10개의 값을 가진 100개의 배열(vector)이 있고, 총 1,000개의 서로 다른 연속된 수가 저장되어 있다. 16개의 스레드가 이 배열들을 공유하며, 각 스레드는 무작위로 2개의 배열을 선택하고 각 배열에서 무작위 위치를 결정하여 두 배열의 요소 내용을 교환한다. 이 작업을 300,000번 반복해도 모든 수가 손실되지 않는다.

```lisp

(defn run [nvecs nitems nthreads niters]

(let [vec-refs (vec (map (comp ref vec)

(partition nitems (range (* nvecs nitems)))))

swap #(let [v1 (rand-int nvecs)

v2 (rand-int nvecs)

i1 (rand-int nitems)

i2 (rand-int nitems)]

(dosync

(let [temp (nth @(vec-refs v1) i1)]

(alter (vec-refs v1) assoc i1 (nth @(vec-refs v2) i2))

(alter (vec-refs v2) assoc i2 temp))))

report #(do

(prn (map deref vec-refs))

(println "Distinct:"

(count (distinct (apply concat (map deref vec-refs))))))]

(report)

(dorun (apply pcalls (repeat nthreads #(dotimes [_ niters] (swap)))))

(report)))

(run 100 10 16 300000)

5. 6. 다중 동적 디스패치

클로저는 임의적인 개수의 인자들의 타입과 값에 대한 다중 동적 디스패치(멀티메서드)를 지원한다. 일반적인 객체 지향 시스템에서 구현된 다형성 개념은 첫 번째 인자의 타입만으로 동적 디스패치 하는 것이다.

6. 확장 가능한 데이터 표기법 (edn)

'''확장 가능한 데이터 표기법''' 또는 '''edn'''[50]은 데이터 전송 형식으로 사용하기 위한 클로저 언어의 하위 집합이다. 클로저 데이터 구조를 직렬화 및 역직렬화하는 데 사용할 수 있으며, 클로저 자체는 edn의 상위 집합을 사용하여 프로그램을 나타낸다.

edn은 JSON 또는 XML과 유사한 방식으로 사용되지만, 더 많은 내장 요소를 가지고 있다. 다음은 그 예시이다.


  • 불리언: `true`, `false`
  • 문자열: `"foo bar"`
  • 문자: `\c`, `\tab`
  • 심볼: `name`
  • 키워드: `:key`
  • 정수: `123`
  • 부동 소수점 숫자: `3.14`
  • 리스트: `(a b 42)`
  • 벡터: `[a b 42]`
  • 맵: `{:a 1, "foo" :bar, [1 2 3] four}`
  • 세트: `#{a b [1 2 3]}`
  • nil: `nil` (널과 같은 값)


이러한 요소 외에도 문자 `#`과 심볼로 구성된 ''태그''를 사용하여 확장성을 지원한다. 태그를 만나면 리더는 다음 요소의 값을 해당 핸들러에 전달하고, 핸들러는 데이터 값을 반환한다. 예를 들어, `#myapp/Person {:first "Fred" :last "Mertz"}`와 같은 태그가 지정된 요소가 있을 수 있으며, 이 요소의 해석은 리더의 적절한 핸들러에 따라 달라진다.

다른 요소들의 관점에서 확장 요소의 이러한 정의는 기본 집합에 포함되지 않은 요소를 전달하기 위해 관례나 컨텍스트에 의존하는 것을 피한다.

7. 변형 및 다른 플랫폼

자바[19][35]가 클로저의 주된 플랫폼이지만, JVM이 아닌 다른 플랫폼에서 동작하는 클로저 구현체들도 존재한다. 대표적으로 ECMAScript 3으로 컴파일되는 ClojureScript[51]와 .NET 플랫폼에 완전히 포팅되어 상호 운용이 가능한 ClojureCLR[53]이 있다.

7. 1. ClojureCLR

공통 언어 런타임(CLR)에서 동작하며 닷넷 라이브러리와 함께 사용할 수 있는, 원본 클로저 언어의 기능을 완전히 구현한 변형판이다.[139] .NET 플랫폼 전체를 포팅하여 해당 생태계와 상호 운용이 가능하다.[53]

7. 2. ClojureScript

웹 브라우저와 모바일 장치에서 사용하기 위해 클로저 언어의 일부분을 포팅하였다.[140] 코드를 컴파일하면 최적화된 JavaScript가 생성된다.[140] ECMAScript 3으로 컴파일되는 ClojureScript[51]는 주목할 만한 다른 대상 구현체 중 하나이다.

7. 3. 기타

JVM이 아닌 다른 플랫폼에서 동작하는 클로저 프로그래밍 언어의 구현들은 다음과 같다.

  • clojure-py: 순수 파이썬으로 구현된 클로저[141]
  • Babashka: GraalVM 네이티브 이미지 및 Small Clojure Interpreter를 활용하는 네이티브 클로저 스크립팅 언어[54]
  • CljPerl: Perl에서 실행되는 클로저[55]
  • ClojureDart: 클로저를 Dart 및 Flutter로 이식[56]
  • Clojerl: Erlang 가상 머신에서 실행되는 클로저[57]
  • basilisp: Python 3.8+을 타겟으로 하는 클로저 호환(-ish) Lisp 방언[58]
  • ClojureRS: Rust에서 실행되는 클로저[59]
  • Ferret: 마이크로컨트롤러에서 실행될 수 있는 자체 포함형 C++11로 컴파일[60]
  • jank: LLVM 기반 JIT에서 C++로 호스팅되는 네이티브 클로저[61]
  • Joker: Go로 작성된 인터프리터 및 린터[62]
  • Las3r: ActionScript 가상 머신 (Adobe Flash Player 플랫폼)에서 실행되는 클로저의 하위 집합[63]
  • Pixie: RPython으로 작성된 클로저에서 영감을 얻은 Lisp 방언[64]
  • Rouge: Ruby의 YARV에서 실행되는 클로저[65]

8. 개발 도구

클로저 개발 도구는 수년에 걸쳐 발전해왔다. Clojure 1.9 이후 공식 Clojure 명령줄 인터페이스(CLI) 도구[80]리눅스, macOS, Windows에서 사용할 수 있게 되었다.[81]

8. 1. IDE 및 텍스트 편집기

Clojure 개발을 위한 도구는 수년에 걸쳐 상당한 개선을 이루었다. 다음은 Clojure 프로그래밍을 지원하는 플러그인이 있는 몇 가지 인기 있는 IDE 및 텍스트 편집기 목록이다.[66]

  • Emacs, CIDER 포함[67]
  • IntelliJ IDEA, Cursive 포함[68] (비상업적 사용에 대해 무료 라이선스 제공)
  • Sublime Text, Clojure Sublimed 포함,[69] 또는 Tutkain[70]
  • Vim, fireplace.vim 포함,[71][72] vim-elin,[73] 또는 Conjure (Neovim 전용)[74][75]
  • Visual Studio Code, Calva 포함[76] 또는 Clover[77]
  • IDE 독립적 (정적 분석 및/또는 린팅을 위해 언어 서버 프로토콜 사용): clj-kondo[78] 또는 clojure-lsp[79]

8. 2. 공식 CLI 도구

Clojure 1.9 이후 공식 Clojure 명령줄 인터페이스(CLI) 도구[80]리눅스, macOS, Windows에서 사용할 수 있게 되었다.[81]

9. 개발 과정

클로저 개발은 핵심 팀으로 제한되지만, 문제점은 JIRA 프로젝트 페이지에서 공개적으로 볼 수 있다.[82] 누구나 ask.clojure.org에서 질문하거나 문제 및 아이디어를 제출할 수 있다.[83] JIRA 문제는 스크리너 팀에 의해 처리되며 최종적으로 리치 히키(Rich Hickey)의 승인을 받는다.[84][85]

10. 영향 및 평가

ThoughtWorks는 2010년에 클로저를 "JVM에서 구현된 단순하고 우아한 리스프"라고 평가했으며, 2012년에는 "채택(ADOPT)" 단계로 승격시켰다.[98] 또한 클로저는 시각 예술, 음악, 게임, 시 등 창작 컴퓨팅에도 활용되고 있다.[110]

10. 1. 추천

함수형 프로그래밍에 대한 지속적인 관심과 함께, 자바 플랫폼을 사용하는 소프트웨어 개발자들의 클로저 채택이 계속 증가하고 있다. 브라이언 고에츠,[86][87][88] 에릭 에반스,[89][90] 제임스 고슬링,[91] 폴 그레이엄,[92] 로버트 C. 마틴[93][94][95][96] 등 저명한 소프트웨어 개발자들도 클로저를 추천했다. ThoughtWorks는 2010년 기술 레이더에서 클로저를 "JVM에서 구현된 단순하고 우아한 리스프"라고 평가했고, 2012년에는 "채택(ADOPT)" 단계로 승격시켰다.[98]

10. 2. 산업적 사용

함수형 프로그래밍에 대한 지속적인 관심과 함께, 자바 플랫폼을 사용하는 소프트웨어 개발자들의 클로저 채택이 계속 증가하고 있다. 이 언어는 브라이언 고에츠,[86][87][88] 에릭 에반스,[89][90] 제임스 고슬링,[91] 폴 그레이엄,[92] 로버트 C. 마틴[93][94][95][96]과 같은 소프트웨어 개발자들에 의해 추천되었다. ThoughtWorks는 2010년에 클로저를 "JVM에서 구현된 단순하고 우아한 리스프"라고 설명했으며, 2012년에는 그 지위를 "채택(ADOPT)"으로 승격시켰다.[98]

Snyk와 Java Magazine의 협력으로 준비된 "JVM 생태계 보고서 2018" ("역대 최대 규모의 자바 개발자 설문조사"라고 주장됨)에서, 클로저는 "주요 애플리케이션"을 위한 JVM에서 두 번째로 많이 사용되는 프로그래밍 언어로 평가되었다.[99] 클로저는 애플,[101][102] 아틀라시안,[103] 펀딩 서클,[104] 넷플릭스,[105] 누뱅크,[106] 퍼펫 랩스,[107] 월마트[108]와 같은 기업과 NASA와 같은[109] 정부 기관에서 산업적으로 사용되고 있다. 또한 시각 예술, 음악, 게임, 시 등 창작 컴퓨팅에도 활용되고 있다.[110]

스택 오버플로우 개발자 설문조사 2023년판에서, 클로저는 프로그래밍 및 스크립팅 언어 범주에서 4번째로 가장 "존경받는" 언어로 선정되었으며, 작년에 클로저를 사용한 응답자의 68.51%가 계속 사용하고 싶다고 답했다. 그러나 "선호하는" 언어 범주에서는 설문조사에 참여한 개발자의 2.2%만이 클로저를 선호한다고 답했고, 가장 높은 점수를 받은 자바스크립트는 40.15%의 개발자가 "선호하는" 언어로 선택했다.[111]

10. 3. 설문 조사

Snyk와 Java Magazine이 협력하여 준비한 "JVM 생태계 보고서 2018"에서는 클로저가 "주요 애플리케이션"을 위한 JVM에서 두 번째로 많이 사용되는 프로그래밍 언어로 평가되었다.[99] 스택 오버플로우 개발자 설문조사 2023년판에서 클로저는 프로그래밍 및 스크립팅 언어 범주에서 4번째로 가장 "존경받는" 언어로 선정되었으며, 작년에 클로저를 사용한 응답자의 68.51%가 계속 사용하고 싶다고 답했다. 그러나 "선호하는" 언어 범주에서는 설문조사에 참여한 개발자의 2.2%만이 클로저를 선호한다고 답했고, 가장 높은 점수를 받은 자바스크립트는 40.15%의 개발자가 "선호하는" 언어로 선택했다.[111]

11. 예제

다음은 스윙을 이용해 GUI에 "Hello World!"를 출력하는 예제이다.

```clojure

(javax.swing.JOptionPane/showMessageDialog nil "Hello World!")

11. 1. 헬로 월드 프로그램

clojure

(println "Hello world!")

```

콘솔에 "Hello world!"를 출력한다.

스윙을 호출하여 GUI에 "Hello World!"를 출력하는 프로그램은 다음과 같다.

```clojure

(javax.swing.JOptionPane/showMessageDialog nil "Hello World!")

참조

[1] 웹사이트 Agents and Asynchronous Actions https://clojure.org/[...] 2019-07-07
[2] 웹사이트 Concurrent Programming https://clojure.org/[...] 2019-07-07
[3] 웹사이트 core.async https://github.com/c[...] 2019-07-07
[4] 웹사이트 Functional Programming https://clojure.org/[...] 2019-07-07
[5] 웹사이트 core.logic https://github.com/c[...] 2019-07-07
[6] 웹사이트 Macros https://clojure.org/[...] 2019-07-07
[7] 웹사이트 Threading Macros Guide https://clojure.org/[...] 2019-07-07
[8] 웹사이트 Rich Hickey Q&A http://www.codequart[...]
[9] 웹사이트 Simple Made Easy https://youtube.com/[...]
[10] 간행물 A Practical Optional Type System for Clojure The University of Western Australia
[11] 웹사이트 Clojure Programming http://cdn.oreilly.c[...] 2013-04-30
[12] 웹사이트 Clojure Bookshelf https://www.amazon.c[...] 2019-07-07
[13] 웹사이트 Janet Language https://janet-lang.o[...] 2023-02-18
[14] 웹사이트 Pixie https://www.pixielan[...] 2019-07-07
[15] 웹사이트 Rhine https://github.com/a[...] 2019-07-07
[16] 웹사이트 The A-Z of Programming Languages: Clojure https://www.computer[...] 2009-08-10
[17] 웹사이트 meaning and pronunciation of Clojure https://groups.googl[...] 2009-01-05
[18] 웹사이트 Clojure inventor Hickey now aims for Android https://www.infoworl[...] 2012-03-22
[19] 웹사이트 Clojure https://clojure.org/ 2019-07-07
[20] 웹사이트 The Reader https://clojure.org/[...] 2019-07-07
[21] 웹사이트 Differences with other Lisps https://clojure.org/[...] 2019-07-07
[22] 웹사이트 Values and Change: Clojure's approach to Identity and State https://clojure.org/[...] 2019-07-07
[23] 웹사이트 Rationale https://clojure.org/[...] 2019-07-07
[24] 웹사이트 Expert to Expert: Rich Hickey and Brian Beckman – Inside Clojure https://channel9.msd[...] 2009-10-06
[25] 웹사이트 clojure/spec.alpha https://github.com/c[...] 2017-04-26
[26] 웹사이트 '[ANN] dotLisp: A Lisp dialect for .Net' https://groups.googl[...] 2002-10-16
[27] 웹사이트 jfli https://sourceforge.[...] 2013-04-15
[28] 웹사이트 foil: Foreign Object Interface for Lisp https://sourceforge.[...] 2013-04-03
[29] 웹사이트 Lisplets https://sourceforge.[...] 2013-03-07
[30] 논문 A history of Clojure 2020-06-12
[31] 웹사이트 Economy Size Geek – Interview with Rich Hickey, Creator of Clojure https://www.linuxjou[...] 2010-04-01
[32] 웹사이트 Simple Made Easy https://www.infoq.co[...] 2024-05-02
[33] 웹사이트 (iterate think thoughts): Advantages of Data Oriented Programming https://yogthos.net/[...] 2024-05-02
[34] 웹사이트 talk-transcripts/Hickey_Rich/EffectivePrograms.md at master · matthiasn/talk-transcripts https://github.com/m[...] 2024-05-02
[35] 웹사이트 Hosted on the JVM https://clojure.org/[...] 2019-07-07
[36] 웹사이트 Java Interop https://clojure.org/[...] 2019-07-07
[37] 웹사이트 edn https://github.com/e[...] 2019-07-07
[38] 웹사이트 Multimethods and Hierarchies https://clojure.org/[...] 2019-07-07
[39] 웹사이트 Protocols https://clojure.org/[...] 2019-07-07
[40] 웹사이트 Datatypes: deftype, defrecord and reify https://clojure.org/[...] 2019-07-07
[41] 웹사이트 Stewardship: the Sobering Parts https://www.youtube.[...] 2014-11-20
[42] 웹사이트 tail calls in the VM https://blogs.oracle[...] 2007-07-12
[43] 웹사이트 Some languages need to be able to perform tail calls https://bugs.openjdk[...] 2009-02-11
[44] 웹사이트 Special Forms https://clojure.org/[...] 2019-07-07
[45] 웹사이트 Refs and Transactions https://clojure.org/[...] 2019-07-07
[46] 웹사이트 Clojure core.async Channels https://clojure.org/[...] 2013-06-28
[47] 웹사이트 Transducers https://www.youtube.[...] 2014-09-17
[48] 웹사이트 Transducers are Coming https://blog.cognite[...] 2014-08-06
[49] 웹사이트 Inside Transducers https://www.youtube.[...] 2014-11-20
[50] 웹사이트 Official EDN Spec http://edn-format.or[...] 2022-04-27
[51] 웹사이트 ClojureScript https://clojurescrip[...] 2019-07-06
[52] 웹사이트 ClojureScript – FAQ (for JavaScript developers) https://clojurescrip[...] 2018-02-04
[53] 웹사이트 ClojureCLR https://github.com/c[...] 2012-06-28
[54] 웹사이트 Babashka https://babashka.org 2019-08-19
[55] 웹사이트 A Lisp on Perl https://metacpan.org[...] 2019-07-06
[56] 웹사이트 What is ClojureDart? https://github.com/T[...] Tensegritics 2022-12-16
[57] 웹사이트 Clojerl https://github.com/c[...] 2019-07-06
[58] 웹사이트 basilisp https://github.com/b[...] 2024-05-13
[59] 웹사이트 ClojureRS https://github.com/c[...] 2022-03-17
[60] 웹사이트 Ferret https://ferret-lang.[...] 2019-07-06
[61] 웹사이트 jank https://jank-lang.or[...] 2022-08-17
[62] 웹사이트 Joker https://joker-lang.o[...] 2019-07-06
[63] 웹사이트 Laz3r https://github.com/a[...] 2019-07-06
[64] 웹사이트 Pixie http://www.pixielang[...] 2019-07-06
[65] 웹사이트 Rouge https://github.com/e[...] 2019-07-06
[66] 웹사이트 "State of Clojure 2019" Results https://www.clojure.[...] 2019-02-04
[67] 웹사이트 CIDER: The Clojure Interactive Development Environment that Rocks https://cider.mx/ 2019-07-05
[68] 웹사이트 Cursive: Provides full Clojure and ClojureScript language support https://plugins.jetb[...] 2019-07-05
[69] 웹사이트 Clojure Sublimed https://packagecontr[...] 2023-02-18
[70] 웹사이트 Tutkain https://tutkain.flow[...] 2023-02-18
[71] 웹사이트 fireplace.vim: Clojure REPL Support https://www.vim.org/[...] 2019-07-05
[72] 웹사이트 Clojure and Vim: An overview – It's very possible https://juxt.pro/blo[...] 2016-12-13
[73] 웹사이트 vim-elin: A Clojure development environment for Vim/Neovim, primarily written in Babashka. https://github.com/l[...] 2024-05-02
[74] 웹사이트 Neovim Clojure(Script) tooling over prepl https://github.com/O[...] 2019-11-09
[75] 웹사이트 Getting started with Clojure, Neovim and Conjure in minutes https://oli.me.uk/ge[...] 2019-11-06
[76] 웹사이트 Calva: Clojure & ClojureScript Interactive Programming https://marketplace.[...] 2019-07-05
[77] 웹사이트 Clover https://marketplace.[...] 2021-01-28
[78] 웹사이트 clj-kondo/clj-kondo https://github.com/c[...] clj-kondo 2024-05-02
[79] 웹사이트 Overview - Clojure LSP https://clojure-lsp.[...] 2024-05-02
[80] 웹사이트 Deps and CLI Guide https://clojure.org/[...] 2019-07-08
[81] 웹사이트 Clojure 1.9 http://blog.cognitec[...] 2017-12-08
[82] 웹사이트 Clojure https://clojure.atla[...] 2019-07-07
[83] 웹사이트 Clojure Forum https://clojure.org/[...] 2020-03-20
[84] 웹사이트 Open Source is Not About You https://gist.github.[...] 2018-11-26
[85] 웹사이트 Workflow https://clojure.org/[...] 2019-07-07
[86] 웹사이트 Brian Goetz' favorite non-Java JVM language (Part 1 of 3) https://www.twitch.t[...] 2020-05-24
[87] 웹사이트 Brian Goetz' favorite non-Java JVM language (Part 2 of 3) https://www.twitch.t[...] 2020-05-24
[88] 웹사이트 Brian Goetz' favorite non-Java JVM language (Part 3 of 3) https://www.twitch.t[...] 2020-05-24
[89] 웹사이트 Modelling Time: Eric Evans: Domain-Driven Design Europe 2018 https://www.youtube.[...] 2018-08-14
[90] 웹사이트 Eric Evans on Twitter https://twitter.com/[...] 2014-11-21
[91] 웹사이트 James Gosling meetup with London Java Community https://www.youtube.[...] 2016-10-11
[92] 웹사이트 Paul Graham on Twitter https://twitter.com/[...] 2016-05-06
[93] 웹사이트 Why Clojure? http://blog.cleancod[...] 2019-08-22
[94] 웹사이트 Unble Bob Martin on Twitter https://twitter.com/[...] 2018-11-29
[95] 웹사이트 Introduction To Functional Programming https://cleancoders.[...] 2018-08-01
[96] 웹사이트 Pragmatic Functional Programming https://blog.cleanco[...] 2017-07-11
[97] 웹사이트 Technology Radar {{!}} An opinionated guide to today's technology landscape https://www.thoughtw[...] 2024-05-20
[98] 웹사이트 Technology Radar: Clojure https://www.thoughtw[...] 2019-02-10
[99] 웹사이트 JVM Ecosystem Report 2018 https://snyk.io/blog[...] 2018-10-17
[100] 웹사이트 Success Stories https://clojure.org/[...] 2018-10-27
[101] 웹사이트 Roman Liutikov on Twitter https://twitter.com/[...] 2017-12-17
[102] 웹사이트 Jobs at Apple https://jobs.apple.c[...] 2019-07-06
[103] 웹사이트 Realtime Collaboration with Clojure https://www.youtube.[...] 2015-07-07
[104] 웹사이트 Clojure in London: Funding Circle – Lending some Clojure https://juxt.pro/blo[...] 2016-10-04
[105] 웹사이트 The New Stack Makers: Adrian Cockcroft on Sun, Netflix, Clojure, Go, Docker and More https://thenewstack.[...] 2014-08-03
[106] 웹사이트 Nubank adquire empresa norte-americana de tecnologia Cognitect https://valorinveste[...] 2020-07-23
[107] 웹사이트 A New Era of Application Services at Puppet Labs https://puppet.com/b[...] 2014-04-11
[108] 웹사이트 Walmart Runs Clojure at Scale https://blog.cognite[...] 2015-07-14
[109] 웹사이트 Common-Metadata-Repository https://github.com/n[...] 2019-07-06
[110] 웹사이트 Creative computing with Clojure http://radar.oreilly[...] 2015-05-06
[111] 웹사이트 Stack Overflow Developer Survey 2023 https://survey.stack[...] 2024-05-02
[112] 웹사이트 Clojure 1.0 https://clojure.blog[...] 2009-05-04
[113] 웹사이트 Clojure 1.1 Release https://clojure.blog[...] 2009-12-31
[114] 웹사이트 Clojure 1.2 Release https://groups.googl[...] 2010-08-19
[115] 웹사이트 "[ANN] Clojure 1.3 Released" https://groups.googl[...] 2011-09-23
[116] 웹사이트 "[ANN] Clojure 1.4 Released" https://groups.googl[...] 2012-04-17
[117] 웹사이트 ANN: Clojure 1.5 https://groups.googl[...] 2013-03-01
[118] 웹사이트 Clojure 1.5.1 https://groups.googl[...] 2013-03-10
[119] 웹사이트 "[ANN] Clojure 1.6" https://groups.googl[...] 2014-03-25
[120] 웹사이트 Clojure 1.7 is now available https://clojure.org/[...] 2015-06-30
[121] 웹사이트 Clojure 1.8 is now available https://clojure.org/[...] 2016-01-19
[122] 웹사이트 Clojure 1.9 is now available https://clojure.org/[...] 2017-12-08
[123] 웹사이트 Clojure 1.10 release https://clojure.org/[...] 2018-12-17
[124] 웹사이트 Clojure 1.10.1 release https://clojure.org/[...] 2019-06-06
[125] 웹사이트 Clojure 1.10.2 release https://clojure.org/[...] 2021-01-26
[126] 웹사이트 Clojure 1.10.3 release https://clojure.org/[...] 2021-03-04
[127] 웹사이트 Clojure 1.11.0 release https://clojure.org/[...] 2022-03-22
[128] 웹사이트 Clojure 1.11.1 release https://clojure.org/[...] 2022-04-05
[129] 웹사이트 Clojure 1.11.2 release https://clojure.org/[...] 2024-03-08
[130] 웹사이트 Clojure 1.12.0 release https://clojure.org/[...] 2024-09-05
[131] 웹사이트 Books that influenced Clojure http://www.amazon.co[...] 2009-06-30
[132] 웹사이트 meaning and pronunciation of Clojure https://groups.googl[...] 2014-06-20
[133] 웹사이트 Rationale http://clojure.org/r[...] clojure.org 2008-10-17
[134] 문서 http://channel9.msdn.com/shows/Going+Deep/Expert-to-Expert-Rich-Hickey-and-Brian-Beckman-Inside-Clojure/ http://channel9.msdn[...]
[135] 웹사이트 On State and Identity http://clojure.org/s[...] clojure.org 2010-03-01
[136] 웹인용 Clojure 1.11.0 release https://clojure.org/[...] 2022-03-22
[137] 웹인용 Rationale http://clojure.org/r[...] clojure.org 2013-08-09
[138] 웹인용 Expert to Expert: Rich Hickey and Brian Beckman - Inside Clojure | Going Deep | Channel 9 http://channel9.msdn[...] Channel9.msdn.com 2009-10-06
[139] 웹인용 clojure/clojure-clr · GitHub https://github.com/c[...] Github.com null
[140] 웹인용 clojure/clojurescript · GitHub https://github.com/c[...] Github.com null
[141] 웹인용 halgari/clojure-py · GitHub https://web.archive.[...] Github.com 2013-08-08



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com