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