Hy 1.0 – Dialek Lisp untuk Python
(github.com/hylang)- 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
defmodeldi Hy- Model
User,Address, dan deklarasi relasi ditulis dalam bentuk S-expression Hy defmodeladalah makro yang diekspansi menjadi kode SQLAlchemy, sehingga tidak ada biaya tambahan saat runtime
- Model
- Pengguna tersebut menyatakan bahwa stabilisasi internal Hy dan API-nya diperlukan untuk pekerjaan seperti ini
Diskusi deklarasi relasi dan DSL kueri
- Contoh
defmodeldiperluas ke berbagai pola relasi- one-to-one:
1->1 - many-to-many:
*->*dandeflinktable - field timestamp:
:timestamp-create,:timestamp-update
- one-to-one:
- 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
hy2pydi 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
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
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
Pada akhirnya semuanya menjadi bytecode Python, jadi berjalan dengan baik
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,
matchhanyalahmatchnative Python dan tidak ada polyfill untuk versi sebelum Python 3.10. Dulufoo?diperlakukan sebagai kasus khusus dan di-mangle menjadiis_foo, tetapi itu dihapus;hy.evaldirombak agar lebih miripevalmilik Python; dan utilitas non-inti yang sekadar enak dimiliki sepertiunlesssering dipindahkan ke paket HyruleAwalnya 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,
letpun butuh sekitar empat kali percobaan sampai benar-benar dibuat dengan baikSaat 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
Trueditulis sebagaitruedemi mempertimbangkan Clojure itu pada dasarnya hanya kompleksitas yang tidak perluHYPE 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
kwargsala Common Lisp, beberapa bagian internal, dan satu-dua librarySisi 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
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
letatau perbedaan di sekitar nilai kembalian. Namun, Coconut juga sudah lama berlalu sejak itu, jadi mungkin sudah membaikSelamat. 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
uvx hy@1.0.0Jika menjalankan
echo '(print "hi hn")' > hi.hylaluuvx 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
Tidak ada distribusi mandiri
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 sepertiimport hy; hy.REPL(locals = {\*globals(), \*locals()}).run()Namun, seperti
code.interact(), mengubah variabel lokal di dalam REPL tidak akan dipropagasikan ke scope asalpy2appdan sedikit hacking yang hati-hatiAnda bisa mengompilasi semuanya menjadi bytecode lalu memakai alat distribusi satu file milik Python
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
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