मैक्रो
- Rust के मैक्रो का उपयोग code duplication हटाने और दोहराव कम करने के लिए किया जाता है।
sqleibniz के sentence nodes को Node trait implement करना होता है, जिससे काफी code duplication होता है।
- मैक्रो का उपयोग करके struct definition और
Node trait implementation को automate किया जा सकता है।
code duplication हटाने वाले मैक्रो
- मैक्रो struct को define करते हैं, documentation comments जोड़ते हैं, और
Node trait को satisfy करने वाले functions implement करते हैं।
- मैक्रो दोहराए जाने वाले metavariable definitions के ज़रिए अलग-अलग fields जोड़ सकते हैं।
टेस्ट
- Rust में Go के table-driven tests जैसी पद्धति लागू की जा सकती है।
test_group_pass_assert! और test_group_fail! मैक्रो का उपयोग करके अलग-अलग input और expected output pairs को test किया जा सकता है।
parser टेस्ट
- parser module में भी इसी तरह के मैक्रो का उपयोग करके SQL statements के results को test किया जाता है।
EXPLAIN SQL statements को test करने के लिए sql_stmt_prefix function का उपयोग होता है।
मैक्रो की कमियाँ
rust-analyzer मैक्रो के अंदर अच्छी तरह काम नहीं करता और documentation भी कम है।
character matching
- Rust के
matches! मैक्रो का उपयोग करके characters की तुलना आसानी से की जा सकती है।
- यह जाँचने का एक उदाहरण है कि दिया गया character SQLite number है या नहीं।
token matching
- lexer character stream को token stream में बदलने के बाद, parser उसका उपयोग syntax tree बनाने के लिए करता है।
- token types पहचानने के लिए
match statement का उपयोग किया जाता है।
error display
- error handling के ज़रिए उपयोगकर्ता को स्पष्ट error messages दिए जाते हैं।
optional features
- Rust के
Option type का उपयोग यह जाँचने के लिए किया जाता है कि value मौजूद है या नहीं, साथ ही condition check करने या default value देने के लिए भी।
is_some_and, map, map_or जैसी methods का उपयोग करके code readability बेहतर की जा सकती है।
iterators
- Rust के iterators का उपयोग characters को filter करने और SQLite के number parsing rules के अनुसार process करने के लिए किया जाता है।
1 टिप्पणियां
Hacker News राय
Rust के borrow checker और memory management की कठिनाइयों के कारण Rust का उपयोग करना मुश्किल लगा। Rust के functional programming (FP) तत्व पसंद आए, लेकिन अंततः दूसरी भाषा खोजने का फैसला किया। OCaml मिला और वह संतोषजनक लगा
लगता है कि Rust और PL विचारों के साथ अनुभव की कमी है। AST को algebraic data type के रूप में परिभाषित करना अधिक सरल होगा। Macro ज़्यादातर भाषाओं में अलग तरह से काम करते हैं, लेकिन मुख्य रूप से code duplication हटाने और दोहराव कम करने के लिए उपयोग होते हैं
Haskell में लिखा parser सादगी और readability के मामले में उत्कृष्ट है। यह लगभग BNF की तरह पढ़ा जाता है और इसमें तकनीकी प्रक्रिया बहुत कम होती है, इसलिए वास्तविक grammar पर ध्यान केंद्रित किया जा सकता है
Ragel, Go, Java, C++, C में parser लिखने का अनुभव है। C में JSON parser लिखना Rust code की तुलना में अधिक सरल हो सकता है। Parser infrastructure इतना विकसित हो चुका है कि अब eBNF से parser बनाया जा सकता है
Rust में eBPF disassembler और emulator लिखा है, और Rust parsing कार्यों के लिए उपयुक्त लगता है। हालांकि, macro का उपयोग भाषा के भीतर सामान्य काम करने से अलग महसूस होता है
Go में lexical scanning पर Rob Pike का व्याख्यान पसंद है। यह एक शिक्षाप्रद और सुरुचिपूर्ण तरीका है
Parser combinator library का उपयोग करके high-performance protocol parser को embedded environment में deploy किया जा सकता है। उसी library का उपयोग embedded protocol parser लिखने के लिए भी किया जा सकता है
Rust में पूरा AST parser लिखते समय ठोस AST type hierarchy को व्यक्त करना कठिन था। अजीब type tricks और macro का उपयोग करना पड़ा
sqlite syntax को parse करना कठिन काम है। sqlite प्रेरणादायक source है। Railroad diagram बहुत उपयोगी हैं, और Lemon parser generator को जितनी पहचान मिलनी चाहिए उतनी नहीं मिली है
Algebraic data type वाली भाषाएँ sqlite syntax parsing के लिए उपयुक्त हैं। Typescript भी एक अच्छा विकल्प हो सकता है। Rust में parser लिखने के तरीके पर एक संक्षिप्त परिचय लिखा गया है