2 poin oleh GN⁺ 2024-04-22 | 1 komentar | Bagikan ke WhatsApp
  • Racket adalah bahasa yang matang dengan fokus pada pemrograman berorientasi bahasa, yang menangani pengembangan aplikasi umum dan pembuatan bahasa baru dalam satu ekosistem yang sama
  • Intinya adalah makro dan #lang, yang memungkinkan pembuatan sintaks baru, bahasa khusus domain, dan tata bahasa permukaan yang sudah ada layaknya pustaka serta dapat digunakan per modul
  • Pustaka standar yang mencakup server web, basis data, matematika·statistika, GUI, hingga simulasi ilmiah, bersama ribuan paket, memperluas cakupan pengembangan tujuan umum
  • Typed Racket, contract, sistem objek, dan IDE DrRacket disediakan bersama, sehingga kode fungsional, komponen berorientasi objek, dan tipe bertahap dapat dikombinasikan sesuai kebutuhan
  • Racket bukan sekadar bahasa keluarga Lisp, melainkan lebih dekat ke lingkungan pengembangan yang bertujuan membuat bahasa yang sesuai untuk tiap domain masalah dan menghubungkannya hingga ke eksekusi, penyuntingan, dan dukungan alat

Racket untuk pemrograman berorientasi bahasa

  • Racket adalah bahasa pemrograman yang mengusung sekaligus “Racket, the Programming Language” dan “Racket, the Language-Oriented Programming Language”
  • Racket version 9.2 tersedia untuk digunakan
  • Ini adalah produk matang yang sejak awal mendukung pemrograman grafis lintas platform di Windows, macOS, dan Linux
  • Fitur pengembangan dasarnya mencakup manajemen paket, GUI, biner mandiri, hingga antarmuka eksternal

Cakupan pengembangan aplikasi umum

  • Racket memiliki sekumpulan pustaka yang mencakup aplikasi server web hingga perangkat lunak matematika dan simulasi ilmiah
  • Dokumen utama dan cakupan pustakanya adalah sebagai berikut
  • Toolbox GUI lintas platform dan server web termasuk dalam ekosistem dasarnya
  • Ribuan paket tambahan dapat dipasang dengan satu perintah
    • Contohnya mencakup 3D graphics, Bluetooth socket connector, color maps, data structures, educational software, games, quantum-random number generator, scientific simulations, web script testing, dan lainnya
  • Contoh #lang racket/gui mengimplementasikan permainan tebak angka kecil dengan dialek GUI sambil menggunakan beberapa fitur bahasa sekaligus

Bahasa yang diperluas dengan makro

  • Pemrogram Racket dapat mendefinisikan loop mereka sendiri dan sintaks baru dengan makro
  • Sintaks baru ditambahkan seperti prosedur, metode, atau kelas, dan cukup dengan membuat aturan yang menulis ulang sintaks kustom menjadi ekspresi atau definisi Racket
  • Makro kecil membantu menghilangkan kode berulang yang sulit ditangani dengan fitur lain
    • Dapat mendefinisikan sintaks time-it untuk mengukur waktu eksekusi tugas
    • Dapat menghindari penggunaan lambda yang berulang
    • Makro diekspor dari modul seperti fungsi biasa
  • Seluruh sistem makro juga dapat membangun struktur tempat beberapa makro bekerja sama
  • Racket adalah bahasa fungsional, tetapi sejak awal menyediakan subbahasa classes and objects, mixins and traits
  • Sistem kelas yang mirip Java diimplementasikan sebagai pustaka berbasis makro, sehingga berjalan tanpa dukungan terpisah dari bahasa inti

#lang dan bahasa khusus domain

  • Racket berorientasi sebagai bahasa untuk membuat bahasa, sehingga pemrogram dapat menulis tiap modul dalam bahasa yang paling sesuai
  • Contoh #lang typed/racket menggunakan union type dari String dan Number, occurrence typing, serta pemfilteran list
  • Contoh #lang scribble/base menangani bahasa dokumentasi yang menghasilkan dokumen PDF atau HTML
  • Contoh #lang datalog menggunakan sintaks Datalog untuk mendefinisikan dan melakukan kueri atas relasi parent dan ancestor
  • Bahasa baru dapat dibuat di jendela IDE dan modul dalam bahasa tersebut dapat dijalankan di jendela IDE lain tanpa memerlukan pengaturan, berkas proyek, atau alat eksternal
  • Pengguna Racket umumnya memakai sintaks bertanda kurung, tetapi juga dapat membuat tata bahasa permukaan yang sudah ada yang memerlukan koma dan kurung kurawal seperti pada Datalog
  • Dengan parsing packages, tata bahasa arbitrer dapat dipetakan ke bahasa berbasis kurung lalu dikompilasi ke Racket biasa melalui sistem makro Racket

DrRacket dan ekosistem pengembangan

1 komentar

 
GN⁺ 2024-04-22
Komentar Hacker News
  • Senang melihat Racket muncul di halaman depan. Sejak 1982, untuk pemrograman riset saya terutama memakai Common Lisp, tetapi belakangan saya lebih sering memilih Racket
    Ada bagian-bagian Racket yang tidak saya sukai, yaitu hampir semuanya kecuali compiler, sistem manajemen paket, GUI IDE, binding Emacs, dan fakta bahwa bahasanya menyenangkan untuk ditulis
    Saya tidak terlalu tertarik pada ekosistem riset bahasa pemrograman, dan mungkin itu bagian yang paling dianggap penting oleh para profesor ilmu komputer yang memimpin proyek ini. Meski begitu, saya berharap mereka sukses
    Jadi saya juga merasa seperti menumpang gratis pada proyek Racket. Saya hanya menikmati bagian kecil yang saya sukai, mengabaikan sisanya, dan hampir tidak berkontribusi. Mungkin pengecualiannya hanyalah buku kecil tentang Racket yang saya tulis

    • Saya hampir sepenuhnya setuju dengan ini. Karena sistem manajemen paket, GUI IDE dengan debugger bertahap, kemampuan menulis IDE lintas platform yang dikelola langsung oleh tim inti Racket, serta fitur untuk membuat binary yang dapat dieksekusi dengan mudah, Racket adalah Lisp favorit saya
      Fitur-fitur seperti ini benar-benar berguna dan penting. Saya suka Lisp, tetapi di tempat kerja saya hanya memakai suatu bahasa jika itu alat yang paling cocok untuk pekerjaan tersebut. Berkat fitur-fitur ini, Racket adalah satu-satunya Lisp yang benar-benar bisa saya justifikasi untuk digunakan
      Berkat komunitas, tooling, dan materi belajarnya, secara pribadi Racket adalah bahasa yang mudah saya rekomendasikan kepada orang lain. Saya juga banyak memakai CL dan Clojure, dan ada hal-hal yang saya sukai dari keduanya, tetapi masing-masing punya kekurangan besar sehingga saya tidak merekomendasikannya kepada orang lain
      Saya juga tidak terlalu cocok dengan sisi riset bahasa ini atau fitur lang, dan saya cukup tidak suka HtDP. Namun menurut saya itu hanya proyek-proyek yang tidak saya minati yang dibuat dengan bahasa yang saya sukai, bukan kelemahan bahasa itu sendiri. Dalam praktiknya, saya hampir tidak pernah bersinggungan dengan hal-hal itu
    • https://leanpub.com/racket-ai/read
      Menurut saya itu sudah bisa dianggap kontribusi besar :)
    • Saya memakai CL sehari-hari, dan bukan di ranah riset ataupun riset bahasa pemrograman. Saya belum pernah mencoba Racket, jadi saya penasaran apakah Anda bisa menjelaskan lebih lanjut bagian-bagian Racket yang tidak Anda sukai dibandingkan CL
    • Saya penasaran apa tepatnya yang dimaksud dengan ekosistem riset bahasa pemrograman. Dalam distribusi Racket, yang terlihat benar-benar bisa disebut riset bahasa pemrograman sepertinya hanya Redex
      Bahasanya sendiri memang punya fitur metaprogramming, tetapi bahasa-bahasa modern semuanya punya metaprogramming
      Pengalaman saya di komunitasnya sebagian besar adalah orang-orang yang membicarakan masalah nyata
      Karena Racket dipakai dalam riset bahasa pemrograman atau riset lain, Racket memang disebut dalam makalah terkait dan presentasi konferensi, tetapi tidak mendominasi diskusi
      Contoh: https://racket.discourse.group/t/levin-tree-search-with-cont...
    • Saya pernah memakai Racket dalam mata kuliah ekosistem bahasa pemrograman di universitas, dan dari sisi itu saya juga tidak terlalu menikmatinya. Meski begitu, Racket mudah untuk mulai digunakan dan jelas menjalankan perannya dengan baik. Kalau ingin mulai masuk ke Lisp, secara pribadi menurut saya Racket adalah titik awal yang bagus
      Namun Clojure punya komunitas yang lebih besar dan lebih solid. Sebagai gantinya, karena memakai JVM, konfigurasinya sedikit lebih merepotkan dan ada lebih banyak hal-hal halus yang perlu diperhatikan
  • Racket adalah bahasa yang sangat praktis. Kalau terlihat seperti selera akademis yang aneh, coba lihat apa yang dilakukan Bogdan Popa dengan Racket: https://defn.io/
    Secara pribadi, kalau saya membutuhkan binary dengan GUI native, saya memakai Racket. Racket juga cukup bagus untuk mem-parse hal-hal seperti JSON, XML, dan format file teks
    Buku pendampingnya, How to Design Programs, https://htdp.org/2023-8-14/Book/index.html juga bagus. Buku itu tidak persis mengajarkan Racket, melainkan memakai beberapa bahasa edukasional yang diimplementasikan dengan Racket, tetapi sesekali ada ide-ide berharga yang layak direnungkan kembali
    Sistem makronya mungkin terlihat aneh bagi orang yang datang dari CL dan sejenisnya, tetapi setelah terbiasa, saya merasa lebih mudah tetap cukup waras saat melakukan metaprogramming
    Beberapa sumber berguna lainnya:
    https://www.greghendershott.com/fear-of-macros/
    https://beautifulracket.com/

    • Ada sesuatu yang khususnya menonjol dari pihak Bogdan? Saat saya lihat sekilas, tidak ada yang langsung terasa mengena
  • Saya sangat menyukai bahasa bernama Racket, tetapi alur kerja yang dipaksakan sulit diterima. Saat menulis kode dengan Python, saya menulis kode di editor lalu menjalankannya di shell
    Racket punya waktu startup yang terlalu lama, jadi cara itu tidak berjalan baik. Sebagai gantinya, orang-orang bilang kita harus berinteraksi dengan mesin virtual yang berjalan lama dan REPL
    Namun kalau begitu, kode yang sedang dikerjakan tidak dimulai dari kondisi bersih, melainkan dari kondisi yang dimiliki mesin virtual saat itu. Untuk sesuatu seperti Jupyter Notebook, ini alur yang bagus, tetapi menurut saya kurang cocok untuk program besar

    • Menulis kode di editor lalu menjalankannya di shell juga sepenuhnya valid di Racket. Dari pengalaman saya, waktu startup cukup mirip dengan Python. Memang lambat, tetapi tidak fatal, dan cukup baik terutama jika dikompilasi terlebih dahulu. Ini berguna untuk berkas yang pekerjaannya sudah selesai saat ini
      Menggunakan #lang racket/base alih-alih racket juga membuat perbedaan besar. Detailnya ada di https://docs.racket-lang.org/style/Language_and_Performance....
      Tidak memulai dari “kondisi bersih” tampaknya lebih dekat ke gaya REPL Common Lisp daripada Racket. Di Racket, biasanya saat memuat ulang berkas atau modul, kita harus memulai ulang Racket sehingga mendapatkan lingkungan yang segar. Orang-orang mengeluhkan itu, tetapi saya lebih menyukai pendekatan kondisi bersih Racket dibanding CL
    • Bagian tentang tidak memulai dari “kondisi bersih” dalam dokumentasi tampaknya memungkinkan pengguna secara eksplisit menolak penyimpanan berkas cadangan
      https://docs.racket-lang.org/drracket/drracket-files.html#(p...
      Mungkin tawaran pemulihan juga bisa ditolak
      “Saat DrRacket pertama kali dijalankan, ia memeriksa apakah ada berkas cadangan yang tersisa, dan jika ada, ia menawarkan untuk memulihkan berkas cadangan tersebut”
    • Coba saja pakai Smalltalk sekali :-))
    • Guile mungkin menarik. Terutama saat debugging, menurut saya ia lebih terasa imersif dibanding Racket, dan juga lebih mirip dengan Common Lisp (SBCL)
    • Selamat datang di dunia Smalltalk dan Lisp Machines. IDE modern pun masih belum sepenuhnya mendukung hot reload, penyimpanan state kerja, dan kemampuan mengendalikan seluruh stack pengembangan dengan satu bahasa
  • Saat saya belajar di University of British Columbia, Racket diajarkan di mata kuliah pengantar ilmu komputer. Saya menganggapnya bahasa yang luar biasa, dan karena mahasiswa yang sudah punya pengalaman pemrograman sebelumnya pun hampir tidak pernah mencoba Lisp, itu menempatkan semua orang di garis start yang sama
    Library yang memudahkan membuat game sederhana atau visualisasi juga mengesankan

    • Saya juga mengambil kelas itu di UBC, tetapi mendapat kesan yang sama sekali berbeda. Menurut saya itu buruk sekali, dan khususnya sangat kurang menyiapkan mahasiswa pemula untuk kelas struktur data dan algoritma berikutnya yang menggunakan bahasa imperatif
      Saat menjadi asisten dosen, cukup banyak mahasiswa yang naik ke tahun kedua masih belum bisa menggunakan for loop, dan sangat tertinggal dalam algoritma dasar
      Apresiasi yang lebih mendalam terhadap bahasa fungsional baru muncul setelah kelas teori komputasi di tahun keempat
  • Saya tidak tahu bagaimana seharusnya semua “bahasa” Racket ini diintegrasikan dalam satu aplikasi. Saya melihat bahasa seperti typed/racket, racket/gui, scribble/base, tetapi tidak punya gambaran bagaimana membuat aplikasi GUI dengan kode bertipe sambil juga menghasilkan PDF
    Saya sudah beberapa kali mengikuti tutorial Racket, tetapi masih bingung bagaimana “bahasa-bahasa” yang tampaknya tidak saling berkaitan itu seharusnya dirangkai
    Secara pribadi, saya merasa tiap bab tutorial hanya menjelaskan “bahasa” yang tidak terkait, dan tidak pernah menunjukkan bagaimana semuanya bekerja bersama. Satu bab membahas web server tetapi tidak membahas sistem class, bab lain membahas “bahasa” lain yang mendukung class tetapi tidak menulis web server di sana

    • Anggap saja baris #lang sebagai semacam direktif compiler yang cakupannya adalah berkas tersebut. Kenyataannya jauh lebih banyak daripada itu, tetapi sebagai titik awal itu cukup baik. Jika ingin menambahkan tipe ke aplikasi, strategi yang bagus adalah melakukannya satu per satu per berkas
      Selain baris #lang, Anda juga bisa mengimpor library dengan require, jadi kode GUI dan kode web server bisa ditempatkan bersama dalam satu berkas. #lang juga tidak selalu dibatasi hanya ke satu bahasa sekaligus; jika tidak bentrok, Anda bisa menambahkan lebih banyak pada baris itu
    • Menurut saya ini pertanyaan yang masuk akal. Jika mengembangkan aplikasi besar, kemungkinan besar hampir semua kode akan ditulis dalam bahasa "racket". Jika sangat tertarik pada tipe, sebagian besarnya mungkin berupa "typed/racket"
      Memang benar semua bahasa berbagi fondasi umum dan sampai batas tertentu interoperabel, tetapi sama sekali kecil kemungkinannya program akan dibagi rata menjadi lima bagian dan masing-masing memakai bahasa berbeda. Dokumentasinya mungkin akan ditulis dengan scribble
      Menggunakan bahasa berbeda bisa memberi model pemrograman yang pada dasarnya berbeda, dan itu juga latar yang memungkinkan pengembangan seperti Typed Racket, tetapi seharusnya tidak menjadi penghalang untuk memulai
      Ringkasnya, pakai saja Racket. Jika nanti merasa benar-benar membutuhkan fitur atau gaya pemrograman lain, baru cari apakah sudah ada bahasa yang menyediakannya. Tentu saja ini semua hanya pendapat saya
    • Sejauh yang saya tahu, setiap modul bisa memilih bahasa untuk modul tersebut
  • Situs web ini, Hacker News, ditulis dengan Arc dan berjalan di atas Racket: https://en.wikipedia.org/wiki/Arc_(programming_language)

  • Masalah terbesar Racket bukanlah bahasa atau ekosistemnya: https://news.ycombinator.com/item?id=27531508

    • Saya adalah salah satu siswa Racket school tahun 2018 yang disebutkan di tautan itu. Semua instruktur, termasuk Felleisen dan Butterick, benar-benar membantu dan ramah, baik di dalam maupun di luar kelas.
      Bahkan jika tautan itu diterima sepenuhnya mentah-mentah dan Felleisen dianggap bersikap jahat ala Torvalds dalam interaksi pribadi tertentu, karyanya, termasuk How To Design Programs, memberi dampak yang sangat positif pada hidup saya dan hidup orang lain. Jadi saya tidak akan mengatakan kepada orang-orang agar tidak memanfaatkannya
    • Itu adalah konflik yang sangat personal di antara anggota komunitas yang terkenal. Komunitas Racket yang lebih luas, termasuk tim inti, sangat ramah
    • Felleisen memang orang yang sulit ditoleransi, tetapi juga mudah dihindari. Saya melihatnya lebih sebagai gejala patologi dunia akademik daripada Racket itu sendiri.
      Di komunitas juga ada “nerd aneh” yang berpendapat kuat, sehingga kehadiran mereka terasa lebih besar dan bisa lebih menjengkelkan. Namun, seperti banyak ruang sosial yang tidak ditertibkan oleh uang, begitulah adanya
  • Racket adalah bahasa favorit saya. Cepat dan praktis, memiliki fondasi yang solid, dan model concurrency-nya juga sangat bagus. Ia berbasis konsep yang dipinjam dan diperluas dari Concurrent ML.
    Sistem dokumentasinya juga luar biasa dan terintegrasi dengan ekosistem paket, sehingga sebagian besar paket memiliki dokumentasi berkualitas tinggi dengan rujukan silang. Kompatibilitas mundurnya juga sangat baik; menurut saya jauh lebih baik daripada Python yang saya pakai dalam pekerjaan utama saat ini.
    Karena itu, saya merasa orang-orang yang mengatakan Racket terlalu akademis atau tidak praktis kemungkinan besar belum menggali cukup dalam, atau dulunya siswa yang hanya pernah berurusan dengan bahasa untuk pendidikan.
    Tentu saja tidak sempurna. Komunitasnya kecil, penggunaan memori dasar runtime-nya tinggi, dan untuk pemrosesan paralel harus menjalankan Racket VM untuk setiap thread sistem. Meski begitu, hal-hal seperti ini akan membaik seiring waktu.
    Hal-hal yang saya buat dengan Racket selama beberapa tahun terakhir: situs e-commerce[1], aplikasi notifikasi native macOS/iOS yang tersedia di App Store[2, 3, 4], klien desktop lintas platform untuk Apache Kafka[5, 6, 7], #lang untuk Lua[8]. Selain itu masih ada beberapa hal lain[9][10][11]. Saya pikir semuanya cukup praktis.
    [1]: https://defn.io/2019/08/20/racket-ecommerce/
    [2]: https://defn.io/2020/01/02/ann-remember/
    [3]: https://defn.io/2024/04/09/ann-remember-for-ios/
    [4]: https://github.com/bogdanp/remember
    [5]: https://defn.io/2022/11/20/ann-franz/
    [6]: https://defn.io/2023/10/15/ann-franz-for-windows/
    [7]: https://defn.io/2023/08/10/ann-franz-source-available/
    [8]: https://defn.io/2022/11/12/ann-racket-lua/
    [9]: https://docs.racket-lang.org/http-easy/index.html
    [10]: https://docs.racket-lang.org/deta/index.html
    [11]: https://docs.racket-lang.org/gui-easy/index.html

    • Bogdan juga penulis gui-easy dan http-easy, yang tidak tergantikan dalam ekosistem Racket.
      Ia juga sangat aktif di forum komunitas dan benar-benar banyak memberikan jawaban yang membantu.
      Saya menganggapnya pahlawan tersembunyi bahasa ini, jadi saya ingin sekali menyebutkannya. Bisa dibilang library-library Anda menjalankan kode yang membuat hidup para pengguna yang tidak tahu apa-apa menjadi jauh lebih mudah :)
      https://docs.racket-lang.org/http-easy/index.html
      https://docs.racket-lang.org/gui-easy/index.html
      https://racket.discourse.group
    • Menurut saya kompatibilitas mundur adalah poin yang sangat penting. Saya menggunakan Python secara intensif selama beberapa tahun, tetapi sangat kecewa melihat betapa sedikitnya perhatian pengembang inti dan komunitas terhadap kompatibilitas mundur dalam transisi 2/3, dan setelah itu pun tidak membaik.
      Mungkin ini karena bidang-bidang utama tempat Python digunakan saat ini. Transisi Numeric/Numpy sekitar tahun 2000 sama sekali berbeda.
      Kerusakan setiap beberapa tahun mungkin tidak masalah bagi startup unicorn atau perusahaan yang bergerak cepat dan, secara harfiah, merusak sesuatu. Namun, ada banyak program bernilai bagi orang dan organisasi yang tidak punya kelonggaran untuk menulis ulang algoritma matang setiap beberapa tahun, atau tidak menganggap itu sebagai prioritas
  • Saya kadang-kadang memakai Racket dan menyukainya. Namun saya jadi tahu bahwa beberapa Lisp, terutama Common Lisp, dan mungkin Guile juga, ternyata lebih diremehkan daripada yang saya kira
    Saya ingin bertanya kepada orang-orang yang lebih paham. Fitur Racket apa yang pada awalnya tidak terlihat praktis, relevan, atau berguna, tetapi setelah dicoba ternyata secara tak terduga berguna dalam pemrograman?

  • Sekitar 20 tahun lalu, sebelum MzScheme menjadi PLT Scheme, saya mengerjakan perangkat lunak komersial keamanan email yang memakai MzScheme sebagai bahasa dasarnya. Kodenya lintas platform dan berjalan di Solaris, Linux, serta HP-UX; kode khusus per sistem operasi sekitar 1.000 baris dalam C
    Aturan filter dikompilasi menjadi Scheme itu sendiri. Termasuk UI berbasis web, seluruh kodenya sekitar 30 ribu baris, dan pengembangnya hanya 5–6 orang
    Setelah kemudian berimigrasi, saya bergabung dengan perusahaan yang memiliki produk serupa tetapi fiturnya lebih sedikit; produk itu ditulis dalam C++ dengan ratusan ribu baris kode dan jumlah pengembang yang lebih banyak