2 คะแนน โดย GN⁺ 2024-09-06 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

Clojure 1.12.0

ความเข้ากันได้

Java 8 - ประกาศยุติการรองรับ

  • Clojure 1.12 ยังสร้าง Java 8 bytecode ได้ แต่รีลีสนี้จะเป็นรีลีสสุดท้ายที่ใช้ Java 8
  • รีลีสถัดไปจะย้ายไปใช้ Java LTS รุ่นใหม่

Java 21 - การ pin virtual thread ในโค้ดของผู้ใช้

  • สำหรับผู้ใช้ Clojure ที่ต้องการใช้ virtual thread บน JDK 21 ในเวอร์ชัน 1.12 lazy-seq และ delay จะใช้ lock แทน synchronized block

ความปลอดภัย

  • แก้ไขช่องโหว่ความปลอดภัย CVE-2024-22871

การซีเรียลไลซ์

  • ชนิดข้อมูลของ Clojure implements Java serialization interface
  • ใน 1.11.0 ตัวระบุการซีเรียลไลซ์ของคลาส 2 ตัวถูกเปลี่ยนไป แต่ใน 1.11.1 ได้ย้อนกลับการเปลี่ยนแปลงนี้
  • ใน 1.12.0 ได้ทำงานส่วนที่เหลือสำหรับคลาสอื่น ๆ เสร็จสมบูรณ์

การพึ่งพา

  • อัปเดต dependency spec.alpha เป็น 0.5.238
  • อัปเดต dependency core.specs.alpha เป็น 0.4.74

ความสามารถ

เพิ่มไลบรารีแบบอินเทอร์แอ็กทีฟ

  • มีฟังก์ชันใหม่ที่ช่วยเพิ่มไลบรารีได้โดยไม่ต้องรีสตาร์ต JVM
  • เพิ่มฟังก์ชัน add-lib, add-libs, sync-deps

เริ่มและควบคุม external process

  • เพิ่ม namespace ใหม่ clojure.java.process
  • สามารถควบคุม external process ได้ด้วยฟังก์ชัน start และ exec

Method values

  • เพิ่มความสามารถในการใช้ Java method เป็น higher-order function
  • คอมไพเลอร์จะสร้างฟังก์ชัน wrapper ให้โดยอัตโนมัติ

Qualified methods

  • สามารถใช้ qualified method เป็นค่าได้ด้วยไวยากรณ์ Classname/method, Classname/.method, Classname/new

เมตาดาตา :param-tags

  • สามารถใส่เมตาดาตา :param-tags ให้กับ qualified method เพื่อแก้ปัญหาการเลือก overloaded method ได้

ไวยากรณ์คลาสอาร์เรย์

  • เพิ่มไวยากรณ์สำหรับแทน array class ตัวอย่าง: String/2 หมายถึงอาร์เรย์สตริง 2 มิติ

Functional interface

  • สามารถแปลง Java functional interface ให้ใช้เป็นฟังก์ชัน Clojure ได้

การทำงานร่วมกับ Java Supplier

  • ตอนนี้ implementation ของ IDeref implements interface Supplier ได้โดยตรง

รองรับสตรีม

  • สามารถจัดการสตรีมในแบบของ Clojure ได้ด้วยฟังก์ชัน stream-seq!, stream-reduce!, stream-transduce!, stream-into!

การ implements Spliterable ของ PersistentVector

  • ตอนนี้ PersistentVector มี custom spliterator ที่รองรับการประมวลผลแบบขนาน

drop และ partition ที่มีประสิทธิภาพขึ้น

  • ปรับปรุงประสิทธิภาพของฟังก์ชัน drop, nthrest, nthnext
  • เพิ่มฟังก์ชันใหม่ partitionv, partitionv-all, splitv-at

นโยบายการ intern Var

  • เมื่อ intern var ใน namespace จะสร้าง reference ที่เสถียร
  • แก้ปัญหาที่เกิดขึ้นใน 1.11.0

สรุปโดย GN⁺

  • Clojure 1.12.0 เป็นรีลีสสุดท้ายที่ใช้ Java 8 และรีลีสถัดไปจะย้ายไปใช้ Java LTS รุ่นใหม่
  • ฟีเจอร์ใหม่ได้แก่ การเพิ่มไลบรารีแบบอินเทอร์แอ็กทีฟ การควบคุม external process และการใช้ method values
  • การทำงานร่วมกับ Java ได้รับการปรับปรุงอย่างมาก พร้อมเพิ่มความสามารถ drop และ partition ที่มีประสิทธิภาพขึ้น
  • เป็นการอัปเดตที่มีประโยชน์สำหรับผู้ใช้ Clojure และช่วยเพิ่มประสิทธิภาพการพัฒนาได้

1 ความคิดเห็น

 
GN⁺ 2024-09-06
ความคิดเห็นจาก Hacker News
  • เริ่มสนใจ Clojure หลังจากดูเลกเชอร์ของ Rich บน YouTube และกำลังคิดอยู่ว่าจะนำมาใช้ในบริษัทอย่างไร
    • คิดว่าบทเรียนเรื่องความเรียบง่ายสำคัญมาก
  • รีลีสนี้มีฟีเจอร์ใหม่เจ๋ง ๆ อยู่มากมาย
    • ส่วนตัวชอบฟีเจอร์ add-libs มากที่สุด
    • ทำให้เขียนเดโมไฟล์เดียวหรือโค้ดตัวอย่างขนาดเล็กที่สุดได้ จึงแชร์ได้ง่าย
    • มีประโยชน์เวลาสาธิต Java library ด้วย
  • คิดว่าจะต้องรอถึง Clojure/conj 2024
    • กำลังรอ spec2 อยู่ แต่ตอนนี้ใช้ Malli
    • การเปลี่ยนแปลงอินเทอร์เฟซของฟังก์ชันทำให้ไม่จำเป็นต้องคอยดูแล utility macro อีกต่อไป
  • แม้จะมีการเพิ่มฟีเจอร์ใหม่เข้ามามาก แต่โค้ดเดิมก็ยังทำงานได้เหมือนเดิม
  • ฟีเจอร์ add-libs และ sync-deps มีประโยชน์มาก
    • รีลีสนี้มีขอบเขตต่างจากรีลีสก่อนหน้า
  • มีความเห็นที่สงสัยเกี่ยวกับสถานะของ spec
  • Clojure ผสาน Lisp กับ ecosystem ของ Java เข้าด้วยกัน จึงเหมาะสำหรับการสร้างระบบแบ็กเอนด์
    • น่าเสียดายที่ยังไม่ได้สะท้อนนวัตกรรมบางส่วนหลัง Java 8
  • การเปลี่ยนแปลงอินเทอร์เฟซของฟังก์ชันมีความสำคัญมาก
    • การคงความสามารถในการทำงานร่วมกับ Java ได้เป็นจุดแข็งของ Clojure
  • มีการปรับปรุงดี ๆ หลายอย่าง
    • เป็นภาษาในตระกูล Lisp ที่ใช้เป็นหลัก
  • ดีใจที่ Clojure ยังคงแข็งแกร่งอยู่เสมอ