2 poin oleh GN⁺ 2024-11-09 | 1 komentar | Bagikan ke WhatsApp

Makro

  • Makro di Rust digunakan untuk menghilangkan duplikasi kode dan mengurangi pengulangan.
  • Node kalimat di sqleibniz harus mengimplementasikan trait Node, yang menyebabkan banyak duplikasi kode.
  • Dengan menggunakan makro, definisi struct dan implementasi trait Node dapat diotomatisasi.

Makro untuk Menghilangkan Duplikasi Kode

  • Makro mendefinisikan struct, menambahkan komentar dokumentasi, dan mengimplementasikan fungsi yang memenuhi trait Node.
  • Makro dapat menambahkan berbagai field melalui definisi metavariabel yang berulang.

Pengujian

  • Di Rust, pendekatan yang mirip dengan table-driven test di Go dapat diimplementasikan.
  • Dengan menggunakan makro test_group_pass_assert! dan test_group_fail!, berbagai pasangan input dan output yang diharapkan dapat diuji.

Pengujian Parser

  • Di modul parser juga digunakan makro serupa untuk menguji hasil pernyataan SQL.
  • Fungsi sql_stmt_prefix digunakan untuk menguji pernyataan SQL EXPLAIN.

Kekurangan Makro

  • rust-analyzer tidak bekerja dengan baik di dalam makro, dan dokumentasinya kurang memadai.

Pencocokan Karakter

  • Makro matches! di Rust dapat digunakan untuk membandingkan karakter dengan mudah.
  • Ada contoh untuk memeriksa apakah karakter tertentu merupakan angka SQLite.

Pencocokan Token

  • Setelah lexer mengubah aliran karakter menjadi aliran token, parser menggunakan hasil itu untuk membangun pohon sintaks.
  • Pernyataan match digunakan untuk mengenali jenis token.

Menampilkan Kesalahan

  • Penanganan kesalahan digunakan untuk memberikan pesan kesalahan yang jelas kepada pengguna.

Fitur Opsional

  • Tipe Option di Rust digunakan untuk memeriksa apakah suatu nilai ada, mengecek kondisi, atau menyediakan nilai default.
  • Metode seperti is_some_and, map, dan map_or digunakan untuk meningkatkan keterbacaan kode.

Iterator

  • Iterator di Rust digunakan untuk memfilter karakter dan memprosesnya sesuai aturan parsing angka SQLite.

1 komentar

 
GN⁺ 2024-11-09
Komentar Hacker News
  • Kesulitan menggunakan Rust karena borrow checker dan rumitnya manajemen memori. Menyukai elemen pemrograman fungsional (FP) di Rust, tetapi memutuskan mencari bahasa lain. Menemukan OCaml dan merasa puas

  • Tampaknya kurang memiliki pengalaman dengan Rust dan ide-ide PL. AST kemungkinan akan lebih sederhana jika didefinisikan sebagai tipe data aljabar. Makro bekerja berbeda di sebagian besar bahasa, tetapi umumnya digunakan untuk menghilangkan duplikasi kode dan mengurangi pengulangan

  • Parser yang ditulis dengan Haskell unggul dalam hal kesederhanaan dan keterbacaan. Hampir terbaca seperti BNF, dengan sangat sedikit prosedur teknis sehingga bisa fokus pada tata bahasa yang sebenarnya

  • Memiliki pengalaman menulis parser dengan Ragel, Go, Java, C++, dan C. Menulis parser JSON dalam C bisa lebih sederhana daripada kode Rust. Infrastruktur parser telah berkembang hingga mencapai titik jenuh di mana parser dapat dibuat dengan eBNF

  • Menulis disassembler dan emulator eBPF dengan Rust, dan menganggap Rust cocok untuk pekerjaan parsing. Namun, penggunaan makro terasa berbeda dari bekerja di dalam bahasa itu sendiri

  • Menyukai presentasi Rob Pike tentang pemindaian leksikal di Go. Pendekatannya edukatif dan elegan

  • Dengan menggunakan library parser combinator, parser protokol berperforma tinggi dapat dideploy ke lingkungan embedded. Library yang sama juga dapat digunakan untuk menulis parser protokol embedded

  • Saat menulis parser AST lengkap di Rust, sulit untuk mengekspresikan hierarki tipe AST yang konkret. Harus menggunakan trik tipe yang aneh dan makro

  • Mem-parsing sintaks sqlite adalah pekerjaan yang sulit. sqlite adalah sumber inspirasi. Diagram railroad sangat berguna, dan generator parser Lemon belum mendapat pengakuan yang layak

  • Bahasa dengan tipe data aljabar cocok untuk parsing sintaks sqlite. TypeScript juga bisa menjadi pilihan yang baik. Menulis pengantar singkat tentang cara menulis parser di Rust