3 poin oleh GN⁺ 2024-09-23 | 1 komentar | Bagikan ke WhatsApp
  • Hy 1.0.0, dialek Lisp yang tertanam di Python, telah dirilis setelah sekitar 12 tahun pengembangan sesekali dan penggunaan nyata
  • Di Hy 1.x, perubahan yang memutus kompatibilitas pada elemen bahasa yang terdokumentasi akan menyebabkan kenaikan versi major, dengan pengecualian penghentian dukungan untuk versi Python yang tidak lagi didukung oleh pengembang CPython
  • Fokus ke depan adalah perbaikan bug baru, penambahan kompatibilitas dengan versi Python baru, dan dukungan fitur baru Python dengan cara yang tidak merusak kode Hy 1.x.y yang sudah ada
  • Seorang pengguna memberi contoh penggunaan makro Hy untuk meringkas deklarasi SQLAlchemy ORM menjadi bentuk defmodel, dan menjelaskan bahwa karena ini adalah ekspansi makro, tidak ada biaya tambahan saat runtime
  • Kemungkinan berjalan langsung di atas MicroPython tampaknya sulit karena subset pustaka standar, tetapi mungkin bisa dilakukan dengan mengonversinya dari CPython menggunakan hy2py, lalu hanya memakai konstruksi yang didukung MicroPython

Rilis Hy 1.0.0

  • Hy 1.0.0 telah dirilis
    • Hy adalah dialek Lisp yang tertanam di Python
    • Hingga rilis ini, ada hampir 12 tahun pengembangan sesekali dan banyak penggunaan nyata
  • Pengenalan dan dokumentasi tersedia di Hylang.org
  • Riwayat versi dapat dilihat di NEWS file
  • Sebagai tulisan rilis yang lebih santai, HYPE POST juga ditautkan

Kebijakan kompatibilitas 1.x

  • Ke depannya, breaking change pada bagian bahasa yang terdokumentasi akan menaikkan nomor versi major
  • Pengecualiannya adalah ketika dukungan untuk versi Python yang tidak lagi didukung oleh pengembang CPython dihentikan
  • Disampaikan niat agar kenaikan versi major tidak sering terjadi
  • Fokus pekerjaan ke depan diarahkan pada hal-hal berikut
    • Perbaikan bug yang baru muncul
    • Penambahan kompatibilitas dengan versi Python baru
    • Mendukung fitur baru Python dengan cara yang tidak merusak kode yang berjalan di Hy 1.x.y sebelumnya

Contoh penggunaan makro Hy: DSL model SQLAlchemy

  • Seorang pengguna menjelaskan bahwa ia sedang membuat ORM dan framework web asinkron dengan Hy; keduanya memanfaatkan pustaka yang sudah ada dan sebagian besar tersusun dari makro
  • Diberikan contoh bagaimana deklarasi model dari SQLAlchemy ORM Quick Start Guide dapat ditulis lebih ringkas dengan makro defmodel di Hy
    • Model User, Address, dan deklarasi relasi ditulis dalam bentuk S-expression Hy
    • defmodel adalah makro yang diekspansi menjadi kode SQLAlchemy, sehingga tidak ada biaya tambahan saat runtime
  • Pengguna tersebut menyatakan bahwa stabilisasi internal Hy dan API-nya diperlukan untuk pekerjaan seperti ini

Diskusi deklarasi relasi dan DSL kueri

  • Contoh defmodel diperluas ke berbagai pola relasi
    • one-to-one: 1->1
    • many-to-many: *->* dan deflinktable
    • field timestamp: :timestamp-create, :timestamp-update
  • Setelah deklarasi, objeknya adalah objek SQLAlchemy 2.0 ORM biasa, sehingga hanya bagian DSL skema database yang ditulis dengan Hy dan sisanya dapat ditulis dengan Python
  • DSL kueri masih sedang dikerjakan, dan disebutkan bahwa fluent interface tidak terlalu cocok dengan S-expression
  • Sebuah komentar menyarankan agar syntactic order dan semantic order SQL dibuat selaras, serta menautkan tulisan Google Research SQL Has Problems. We Can Fix Them: Pipe Syntax In SQL
  • Tanggapannya menyebutkan bahwa bentuk seperti |> atau cara yang meniru list comprehension mungkin bisa digunakan, tetapi desain final akan muncul setelah iterasi membuat aplikasi kecil dan melakukan refactoring

Kemungkinan MicroPython dan respons rilis

  • Muncul pertanyaan apakah Hy dapat berjalan di atas MicroPython alih-alih CPython
  • Jawabannya cenderung bahwa berjalan langsung tampaknya sulit karena MicroPython hanya menyertakan subset kecil dari pustaka standar Python
  • Namun, jika menggunakan hy2py di CPython untuk mengonversinya menjadi kode Python, lalu membatasi diri pada konstruksi yang didukung MicroPython, output-nya mungkin dapat dijalankan
  • Pada hari rilis, terlihat peningkatan besar pada jumlah pengunjung unik harian server web yang meng-host Hylang.org

1 komentar

 
GN⁺ 2024-09-23
Pendapat di Hacker News
  • Agak sulit memahami bagaimana Hy sebenarnya diterjemahkan ke Python, dan awalnya saya juga belum yakin apakah ia dikompilasi atau diinterpretasikan
    Akhirnya saya menemukan penjelasan di Wikipedia bahwa “Hy adalah dialek Lisp yang dirancang untuk berinteraksi dengan Python dengan mengubah s-expression menjadi abstract syntax tree (AST) Python”, dan dari kode GitHub tampaknya kompilernya juga ditulis dalam Python: https://github.com/hylang/hy/blob/master/hy/compiler.py
    Di situs utamanya juga sepertinya akan lebih jelas kalau diperkenalkan sebagai “dialek Lisp yang dikompilasi ke Python AST” daripada “dialek Lisp yang di-embed di Python”. Ada banyak cara untuk meng-embed Lisp, seperti menambahkan interpreter, mengompilasi ke bytecode Python, atau mengubahnya menjadi kode sumber Python, dan trade-off masing-masing cukup berbeda

    • Di halaman README/GitHub sudah tertulis bahwa “Hy adalah dialek Lisp yang di-embed di Python, dan karena mengubah kode Lisp menjadi objek AST Python, dunia Python bisa digunakan dalam bentuk Lisp”
    • Benar, kompiler ini ditulis dalam Python dan Hy bukan self-hosting
      Biasanya kode sumber Hy menjadi objek AST Python, lalu Python mengompilasi dan menjalankannya. Namun objek AST Python juga bisa diubah menjadi teks sumber Python, dan interoperabilitas memakai Python dari Hy maupun Hy dari Python juga dimungkinkan: https://hylang.org/hy/doc/v1.0.0/interop
    • Istilah “embed” berasal dari fakta bahwa dalam satu proyek, Python dan Hy bisa dicampur dan melakukan pemanggilan dua arah
      Pada akhirnya semuanya menjadi bytecode Python, jadi berjalan dengan baik
    • Dalam presentasi awal Hy, memang jelas disebutkan bahwa Lisp di-embed dengan cara dikompilasi menjadi bytecode Python
      Bisa dilihat sekitar menit 16:25 pada video berikut: https://m.youtube.com/watch?v=1vui-LupKJI
  • Seiring Hy matang selama bertahun-tahun, alih-alih menumpuk syntactic sugar dan kasus khusus agar terasa lebih Lispy dan tidak terlalu Pythony, tampaknya Hy justru menjadi lebih dekat ke abstraksi sintaksis tipis atas kumpulan fitur Python
    Dengan kata lain, arahnya fokus pada inti yang sulit ditiru dengan cara lain, terutama macro. Contoh terbaru, match hanyalah match native Python dan tidak ada polyfill untuk versi sebelum Python 3.10. Dulu foo? diperlakukan sebagai kasus khusus dan di-mangle menjadi is_foo, tetapi itu dihapus; hy.eval dirombak agar lebih mirip eval milik Python; dan utilitas non-inti yang sekadar enak dimiliki seperti unless sering dipindahkan ke paket Hyrule
    Awalnya arah ini terasa kontraintuitif, tetapi keuntungannya besar: kurva belajar saat berpindah dari Python ke Hy menjadi lebih rendah, dan interaksi yang konsisten dengan paket Python menjadi lebih mudah. Mungkin juga ada alasan untuk menyederhanakan pemeliharaan bahasa; seingat saya, let pun butuh sekitar empat kali percobaan sampai benar-benar dibuat dengan baik

    • Pada suatu titik saya menyadari bahwa meminimalkan perbedaan yang tidak perlu dengan Python membuat pemeliharaan dan penggunaan bahasa jauh lebih mulus
      Saat menulis kode Hy pun, saya jauh lebih sering melihat dokumentasi Python atau dokumentasi library Python pihak ketiga daripada dokumentasi Hy. Saya merasa ada banyak area Python yang bisa diperbaiki, tetapi fitur lama yang memungkinkan True ditulis sebagai true demi mempertimbangkan Clojure itu pada dasarnya hanya kompleksitas yang tidak perlu
  • HYPE POST-nya benar-benar bagus. Dari sudut pandang orang yang bekerja di software enterprise, selera satirnya sangat tajam
    https://github.com/hylang/hy/discussions/2609

  • Karena akhirnya sudah rilis, sekarang saya bisa membereskan https://github.com/rcarmo/sushy
    Saya sudah mengutak-atiknya sedikit demi sedikit selama beberapa tahun, tetapi setiap kali meng-upgrade Hy, sebagian sintaks rusak atau fitur keluar-masuk paket Hyrule, jadi cukup merepotkan
    Sebagai catatan, Hy juga berjalan cukup baik di dalam https://holzschu.github.io/a-Shell_iOS di iPad. Namun syntax highlighting vim/neovim perlu mengejar rilis 0.29+ dan async
    Selama ini saya juga mencoba Fennel dan Guile, tetapi saya lebih suka yang bisa mengakses library dan ekosistem Python. Berkat async, pekerjaan API yang efisien juga bisa dilakukan dengan baik, dan di beberapa Scheme, menangani HTTPS dengan reuse socket serta kontrol header yang rinci masih merepotkan, jadi menurut saya memakai aiohttp jauh lebih baik

  • Dibandingkan titik awalnya yang sederhana, ini sudah berkembang sangat jauh
    Dulu saya menonton lightning talk di PyCon yang pertama kali memperkenalkan Hy ke publik, lalu tak lama kemudian bertemu Paul dan mulai berkontribusi pada versi awal Hy. Saya menangani kwargs ala Common Lisp, beberapa bagian internal, dan satu-dua library
    Sisi main-main itu berguna, terutama untuk menjaga semangat. Menyenangkan bahwa hacker bisa bersikap seperti hacker dan tidak semuanya harus menjadi bisnis. Saya sudah beberapa tahun tidak terlibat, tetapi senang melihat proyek ini terus maju, dan ini terasa seperti tonggak yang luar biasa

  • Untuk penggemar Clojure, terkait ini ada juga Basilisp, dialek Lisp yang cukup mendekati kompatibilitas Clojure dan menargetkan Python 3.8+
    https://github.com/basilisp-lang/basilisp

  • Meski bukan Lisp, dari sudut pandang sebagai bahasa pemrograman fungsional yang ditranspilasi ke Python, Coconut juga menarik: https://coconut-lang.org/
    Saya benar-benar penasaran dengan pengalaman orang-orang yang pernah benar-benar memakai Hy atau Coconut

    • Beberapa tahun lalu saya sempat mencoba Coconut sedikit, dan kesan saya saat itu adalah compilernya belum cukup pintar untuk bisa berguna
      Di bagian paling atas kode yang dihasilkan ada banyak helper function yang di-hardcode, dan programnya jauh lebih lambat dibandingkan menulis hal yang sama dengan Python biasa
      Sebaliknya, Hy menghasilkan kode yang cukup dekat dengan kode Python yang mungkin ditulis manusia secara manual, kecuali sedikit lapisan indireksi yang muncul dari penanganan scope let atau perbedaan di sekitar nilai kembalian. Namun, Coconut juga sudah lama berlalu sejak itu, jadi mungkin sudah membaik
  • Selamat. Ada dua hal yang saya penasaran: apakah mendukung pengembangan berbasis REPL, misalnya apakah ada semacam condition system atau breakloop
    Saya juga penasaran apakah ada distribusi mandiri. Karena mendistribusikan Python sendiri cukup merepotkan, idealnya akan bagus kalau bisa mendistribusikan satu binary Hy tunggal yang mencakup semua dependensi. Baik itu static link maupun file zip yang diekstrak ke direktori sementara, keduanya tidak masalah

    • Bukan distribusi mandiri, tetapi Anda bisa masuk ke Hy REPL dengan uvx hy@1.0.0
      Jika menjalankan echo '(print "hi hn")' > hi.hy lalu uvx hy@1.0.0 hi.hy, itu akan mencetak "hi hn"
      https://docs.astral.sh/uv/guides/tools/#running-tools
      Sebagai catatan, uv juga bisa menginstal dan mengelola versi Python
    • Saya tidak begitu tahu apa itu breakloop. Hy menggunakan sistem exception Python, yang lebih dekat ke sistem exception tradisional daripada condition system Common Lisp
      Tidak ada distribusi mandiri
    • Dokumentasi REPL memuat hal terkait: https://hylang.org/hy/doc/v1.0.0/repl
      Untuk men-debug kode secara interaktif, Anda bisa memasukkan (.run (hy.REPL :locals {#\* (globals) #\* (locals)})) ke kode yang ingin di-debug, dan di Python bisa ditulis seperti import hy; hy.REPL(locals = {\*globals(), \*locals()}).run()
      Namun, seperti code.interact(), mengubah variabel lokal di dalam REPL tidak akan dipropagasikan ke scope asal
    • Saya pernah membuat sesuatu yang mendekati poin nomor 2 dengan py2app dan sedikit hacking yang hati-hati
      Anda bisa mengompilasi semuanya menjadi bytecode lalu memakai alat distribusi satu file milik Python
    • Hy mendukung persis set fitur yang didukung Python. Cukup bagus untuk debugging langkah demi langkah tradisional maupun post-mortem debugging, dan CPython juga punya banyak hook internal yang lebih canggih
      Namun tidak ada hal seperti condition system atau handlers/restarts
  • Saya sangat menyukai bagian yang kurang serius. Saya berharap lebih banyak proyek pemrograman mau menerima keanehan kreatif
    Mungkin itulah cara terbaik untuk menghormati tradisi Python

    • Beberapa tahun lalu, Hy dan dokumentasinya menghapus banyak elemen yang jenaka. Itu mengganggu dan menyebabkan kegagalan test yang berisik
      Namun pada suatu titik saya merasa kami sudah terlalu jauh, jadi belakangan ini kami mencoba memasukkan kembali sedikit unsur jenaka
  • Saya sesekali memakai Hy, dan saat mencoba membuat transformer, saya juga merilis https://github.com/kunalb/orphism yang ditulis dengan Hy
    Sepertinya sekarang waktunya mengeluarkannya lagi dan mencoba menjalankannya dengan benar