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 사용자들에게 유용한 업데이트로, 개발 생산성을 높일 수 있음.