Advent of Code के लिए Gleam इस्तेमाल करने का अनुभव
(blog.tymscar.com)- Advent of Code 2025 के 12 दिनों की पहेलियों को Gleam में हल करते हुए, भाषा के Rust-स्तर के error messages और pipeline-केंद्रित functional style विशेष रूप से प्रभावशाली लगे
echo,fold_until,list.transposeजैसी built-in functions ने debugging और combination problems को हल करना आसान बनाया, और option type-आधारित safety grid puzzles को संभालने में उपयोगी रही- standard library में file IO और regex features शामिल न होना, list pattern matching की सीमाएँ, और explicit comparison syntax जैसी बातें बार-बार उपयोग में असुविधाजनक लगीं
- Erlang VM और JavaScript target के बीच integer handling के अंतर के कारण
bigiका उपयोग करना पड़ा, और कुछ puzzles में external tool (glpsol) को कॉल करके समस्या हल की गई - कुल मिलाकर, functional सोच में बदलाव ने puzzle solving को अधिक स्पष्ट बनाया, और Gleam को वास्तविक projects (जैसे web server development) में आज़माने की इच्छा व्यक्त की गई
Advent of Code 2025 और Gleam का चयन
- हर साल Advent of Code पूरा करने वाले लेखक ने इस बार Gleam भाषा चुनकर 12 दिनों की पहेलियाँ हल कीं
- इस वर्ष आयोजन 25 दिनों के बजाय 12 दिनों तक सीमित था, और हर समस्या की कठिनाई अधिक थी, लेकिन सीखने के लिए इसकी संरचना उपयुक्त रही
- puzzles तेज़ी से आगे बढ़े और toolset पूरी तरह तैयार होने से पहले ही जटिल समस्याएँ सामने आ गईं, जिससे यह नई भाषा सीखने के लिए आदर्श वातावरण बन गया
Gleam के भाषाई फायदे
- इसकी खासियतें हैं संक्षिप्त syntax, उपयोगी compiler error messages, और Rust-स्तर का मददगार feedback
- pipe operator पर आधारित functional style, AoC समस्याओं की संरचना (parsing→transform→fold) से बहुत अच्छी तरह मेल खाती है
- IntelliJ के लिए Gleam extension और LSP स्थिर रूप से काम करते रहे, जिससे development environment आरामदायक रहा
- functional programming (FP), imperative code की तुलना में सोच को समस्या के मूल स्वभाव को व्यक्त करने के तरीके की ओर मोड़ती है
प्रमुख फीचर्स और code उपयोग के उदाहरण
echo: pipeline के बीच में value देखने के लिए एक साधारण output function, जिससे string formatting के बिना debugging संभव हुई- string interpolation feature न होने के कारण text बनाते समय
<>"operator का अधिक उपयोग करना पड़ा, जिसे असुविधा के रूप में बताया गया
- string interpolation feature न होने के कारण text बनाते समय
- option type (
dict.get): grid puzzles में boundary checks के बिना सुरक्षित neighbor traversal संभव हुआ - list utilities
list.transpose: matrix transpose operation के जरिए puzzle structure सरल हुईlist.combination_pairs: 3D point pairs बनाते समय nested loops के बिना एक पंक्ति में काम हो गयाfold_until: शर्त पूरी होने पर जल्दी समाप्त होने वाली fold function, जो puzzle iteration calculations में प्रभावी रही
Gleam की सीमाएँ और असुविधाएँ
- standard library में file IO का अभाव, जिसे
simplifilepackage से पूरा किया गया - regex functionality के लिए भी external dependency (
gleam_regexp) की ज़रूरत पड़ी - list pattern matching की सीमाएँ:
[first, ..middle, last]जैसे रूप संभव नहीं हैं - comparison operations का explicit handling:
ordertype का उपयोग करना पड़ता है, जिससे साधारण comparisons में syntax लंबा हो जाता है
उन्नत उपयोग और puzzle-विशेष उदाहरण
bigi: JavaScript target में integer overflow से बचने के लिए उपयोग किया गया- XOR bitmask: Day 10-1 में light toggle समस्या को XOR operation से model करके प्रभावी ढंग से हल किया गया
glpsolcall: Day 10-2 में linear equations हल करने के लिए LP file बनाकर external command चलाई गई- memoization key: Day 11-2 में node और state को साथ में key के रूप में उपयोग किया गया, जिससे तुरंत computation पूरी हो गई
- अंतिम puzzle input assumptions पर निर्भर थी, और इसे साधारण area comparison (
heuristic_area <= max_area) से हल किया गया
निष्कर्ष और आगे की योजना
- Gleam ने standard library की सीमाओं के बावजूद safety और expressiveness में मजबूत पक्ष दिखाए
- pipelines, option/result types, list functions,
fold_untilजैसी चीज़ों ने puzzle solving को अधिक स्पष्ट बनाया - आगे web server development जैसे वास्तविक projects में उपयोग की योजना है, और अगले साल के Advent of Code में भी Gleam का उपयोग जारी रखने की इच्छा जताई गई
- पूरा source code GitHub repository में सार्वजनिक है (
tymscar/Advent-Of-Code/2025/gleam/aoc/src)
1 टिप्पणियां
Hacker News की राय
Gleam सचमुच एक खूबसूरत language है। लगता है Elixir को type system के मामले में इसी दिशा में विकसित होना चाहिए था
Gleam भी Erlang VM BEAM पर चलता है, और इसकी वजह से concurrency और queue handling बहुत आसान हो जाती है
ecosystem भी शानदार है। लेकिन LLM युग के बाद से लगता है कि 2021 के बाद language development रुक-सा गया है, यह चिंता रहती है
फिर भी Gleam उस दरवाज़े के बंद होने से ठीक पहले अच्छी तरह आ गया, और उम्मीद है कि LLM भी जल्द इसकी बराबरी कर लेंगे
languages syntax और philosophy के स्तर पर पूरी तरह अलग नहीं हो सकतीं, इसलिए शायद यह कोई बहुत बड़ी समस्या नहीं है
Gleam अपने स्तर पर type-safe OTP subset देता है। संबंधित library के लिए gleam-lang/otp देखें
इस साल Advent of Code मैंने Gleam में हल किया, और यह काफ़ी प्रभावशाली लगा
फ़ायदों में performance अच्छी है, और language server हैरान करने लायक मज़बूत है। auto formatting, auto import, pattern matching completion जैसी चीज़ों के कारण development experience बेहतरीन है
कमियाँ यह हैं कि formatter code को ज़रूरत से ज़्यादा vertical बना देता है, और simplicity पर ज़ोर होने से
list.mapजैसी दोहराई जाने वाली लिखावट बहुत होती है। साथ ही library ecosystem अभी कमज़ोर हैlist.mapकोimport gleam/list.{range, map}जैसे लिखकर छोटा किया जा सकता है। C libraries को port करना भी दिलचस्प हो सकता हैList.mapजैसी namespace repetition discoverability को कम कर देती हैमुझे Gleam पसंद है, लेकिन recursive function call restrictions खटकती हैं। internal function calls उतनी स्वतंत्र नहीं हैं
syntax के लिहाज़ से यह Scheme जितना elegant नहीं है, और conceptually Erlang से अधिक सरल है। फिर भी static typing इसका फ़ायदा है
मैंने OCaml भी इस्तेमाल किया है, लेकिन opam lock file की समस्या जैसी वजहों से environment reproducibility कमज़ोर लगी। लगता है SML ecosystem और बड़ा होना चाहिए था
Idris 2 में dependent types और सुंदर design है, लेकिन ecosystem छोटा है, और PureScript Haskell से ज़्यादा practical होते हुए भी JS runtime से बँधा है
echofeature को देखकर लगा कि debugger में ऐसी intermediate result inspection सुविधा default रूप से होनी चाहिएarray slice या filter chain के बीच के results code बदले बिना देख पाना अच्छा होगा
और 2D array को grid की तरह इस्तेमाल करना अक्षम लगता है। 1D array + boundary info अधिक सुरक्षित और कुशल है
मैं Gleam को ज़्यादा नहीं जानता, लेकिन
list.map(fn(line) { line |> calculate_instruction })क्या इसे बस
list.map(calculate_instruction)नहीं लिखा जा सकता?Gleam एक शानदार language है। मुझ पर इसका बहुत गहरा असर नहीं पड़ा, लेकिन लोगों को इसे पसंद करते देख अच्छा लगता है
लगता है Gleam + Lustre का मेल एक नया Elm बन सकता है
आजकल LLM के दौर में यह सोचता हूँ कि क्या नई language सीखना अभी भी मूल्यवान है
अगर LLM ने उस language को नहीं सीखा है, तो डर है कि tool के रूप में उसकी utility कम हो जाएगी
वहीं Swift का syntax जटिल है, इसलिए LLM के लिए उसे संभालना कठिन है
जब मैंने पहले Gleam को देखा था, तो लगा था कि इसमें dynamic dispatch (interface या type class) नहीं है; अब स्थिति क्या है, यह जानना चाहता हूँ
[first, ..rest]या[first, second]संभव है, लेकिन[first, ..middle, last]नहीं।शायद cost ज़्यादा होने की वजह से इसे जानबूझकर रोका गया है
शुक्र है कि blog title police जल्दी पहुँच गई
संबंधित लिंक