2P by neo 3달전 | favorite | 댓글 1개

Clojure 1.12.0

호환성

Java 8 - 호환성 종료 공지

  • Clojure 1.12는 Java 8 바이트코드를 생성하지만, 이는 Java 8을 사용하는 마지막 릴리스임.
  • 이후 릴리스는 새로운 Java LTS 릴리스로 이동할 예정임.

Java 21 - 사용자 코드에서 가상 스레드 고정

  • JDK 21에서 가상 스레드를 사용하려는 Clojure 사용자들을 위해, 1.12에서는 lazy-seqdelaysynchronized 블록 대신 락을 사용함.

보안

  • 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 추가.
  • startexec 함수로 외부 프로세스를 제어할 수 있음.

메서드 값

  • 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가 여전히 강력하게 유지되고 있어 기쁨