Clojure 1.12.0 출시
(clojure.org)Clojure 1.12.0
호환성
Java 8 - 호환성 종료 공지
- Clojure 1.12는 Java 8 바이트코드를 생성하지만, 이는 Java 8을 사용하는 마지막 릴리스임.
- 이후 릴리스는 새로운 Java LTS 릴리스로 이동할 예정임.
Java 21 - 사용자 코드에서 가상 스레드 고정
- JDK 21에서 가상 스레드를 사용하려는 Clojure 사용자들을 위해, 1.12에서는
lazy-seq와delay가synchronized블록 대신 락을 사용함.
보안
- CVE-2024-22871 보안 취약점 수정.
직렬화
- Clojure 데이터 타입은 Java 직렬화 인터페이스를 구현함.
- 1.11.0에서 두 클래스의 직렬화 식별자가 변경되었으나, 1.11.1에서 이를 되돌림.
- 1.12.0에서는 나머지 클래스에 대한 작업을 완료함.
의존성
spec.alpha의존성을 0.5.238로 업데이트.core.specs.alpha의존성을 0.4.74로 업데이트.
기능
라이브러리 인터랙티브 추가
- JVM을 재시작하지 않고 라이브러리를 추가할 수 있는 새로운 함수 제공.
add-lib,add-libs,sync-deps함수가 추가됨.
외부 프로세스 시작 및 제어
- 새로운 네임스페이스
clojure.java.process추가. start와exec함수로 외부 프로세스를 제어할 수 있음.
메서드 값
- Java 메서드를 고차 함수로 사용할 수 있는 기능 추가.
- 컴파일러가 자동으로 래핑 함수를 생성함.
자격 있는 메서드
Classname/method,Classname/.method,Classname/new구문을 사용하여 자격 있는 메서드를 값으로 사용할 수 있음.
:param-tags 메타데이터
- 자격 있는 메서드에 :param-tags 메타데이터를 제공하여 오버로드된 메서드를 해결할 수 있음.
배열 클래스 구문
- 배열 클래스를 나타내는 구문 추가. 예:
String/2는 2차원 문자열 배열을 나타냄.
함수형 인터페이스
- Java 함수형 인터페이스를 Clojure 함수로 변환하여 사용할 수 있음.
Java Supplier 상호 운용성
IDeref구현체가 이제Supplier인터페이스를 직접 구현함.
스트림 지원
stream-seq!,stream-reduce!,stream-transduce!,stream-into!함수로 스트림을 Clojure 방식으로 처리할 수 있음.
PersistentVector의 Spliterable 구현
PersistentVector가 이제 병렬 처리를 지원하는 커스텀 스플리터레이터를 제공함.
효율적인 drop 및 partition
drop,nthrest,nthnext함수의 성능이 향상됨.- 새로운 함수
partitionv,partitionv-all,splitv-at추가.
Var 인턴 정책
- 네임스페이스에서 var를 인턴할 때 안정적인 참조를 생성함.
- 1.11.0에서 발생한 문제를 해결함.
GN⁺의 정리
- Clojure 1.12.0은 Java 8을 사용하는 마지막 릴리스로, 이후 릴리스는 새로운 Java LTS 릴리스로 이동할 예정임.
- 새로운 기능으로는 라이브러리 인터랙티브 추가, 외부 프로세스 제어, 메서드 값 사용 등이 있음.
- Java와의 상호 운용성이 크게 향상되었으며, 효율적인 drop 및 partition 기능이 추가됨.
- Clojure 사용자들에게 유용한 업데이트로, 개발 생산성을 높일 수 있음.
댓글과 토론
Hacker News 의견
- Rich의 YouTube 강의를 보면서 Clojure에 관심을 가지게 되었음. 회사에 도입하는 방법을 고민 중임
- 단순함에 대한 교훈이 매우 중요하다고 생각함
- 이번 릴리스는 많은 멋진 새로운 기능을 포함하고 있음
- 개인적으로 add-libs 기능이 가장 마음에 듦
- 단일 파일 데모나 최소 예제를 작성할 수 있어 공유가 쉬워짐
- Java 라이브러리를 데모할 때도 유용함
- Clojure/conj 2024까지 기다릴 줄 알았음
- spec2를 기다리고 있지만 현재는 Malli를 사용 중임
- 기능 인터페이스 변경으로 유틸리티 매크로를 유지할 필요가 없어짐
- 새로운 기능이 많이 추가되었지만 코드가 그대로 작동함
- add-libs와 sync-deps 기능이 매우 유용함
- 이번 릴리스는 이전 릴리스와 범위가 다름
- spec의 상태에 대해 궁금해하는 의견이 있음
- Clojure는 Lisp와 Java 생태계를 결합하여 백엔드 시스템 구축에 좋음
- Java 8 이후의 혁신을 일부 반영하지 않은 점이 아쉬움
- 기능 인터페이스 변경이 매우 중요함
- Java와의 상호 운용성을 유지하는 것이 Clojure의 강점임
- 많은 멋진 개선 사항이 있음
- 주로 사용하는 Lisp 계열 언어임
- Clojure가 여전히 강력하게 유지되고 있어 기쁨