1 पॉइंट द्वारा GN⁺ 2023-08-09 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • Raku को Python, J, Frink और Excel के गणितीय कामों की कमियों को भरने वाली calculator language के उम्मीदवार के रूप में देखा गया, और छोटे-से प्रयोग से ही यह बेहद शक्तिशाली लेकिन अजीब भाषा लगी
  • Unicode symbols, alphanumeric infix operators, list product·zip·reduce·accumulate, ~~ matcher, और ... sequence जैसी चीजों के साथ इसकी operator-centric expressiveness काफी व्यापक है
  • यूज़र infix operators के अलावा circumfix/postcircumfix operators भी परिभाषित कर सकते हैं, और associativity भी left/right associativity से आगे chain और list associativity तक तय की जा सकती है
  • multiple dispatch सिर्फ type signatures पर नहीं, बल्कि where runtime predicates पर भी branch करता है, और function signatures व उनके parameters को भी first-class values की तरह扱ा जा सकता है
  • बड़े codebase की maintenance के लिए यह बोझिल लग सकता है, लेकिन one-off scripts, calculations और personal tools जैसी छोटे पैमाने की programming के लिए आकर्षक है; documentation, Windows REPL, compile speed और sigil mistakes मुख्य अड़चनें हैं

Raku को देखने की वजह और पहली छाप

  • Raku वही भाषा है जिसे पहले Perl 6 के नाम से जाना जाता था
  • dynamic languages को लेकर असंतोष लिखने के बाद कुछ users ने Raku सुझाया, और मैंने देखा कि क्या यह गणितीय कामों के लिए calculator language के रूप में उपयुक्त है
  • पहले Python, J, Frink, और Excel को मिलाकर इस्तेमाल किया था, लेकिन हर एक में बड़ी कमियां थीं
  • कुछ दिनों के प्रयोग के बाद मिली छाप कुछ ऐसी थी: “यह एक ऐसी भाषा है जिसे सचमुच होशियार gremlins ने, दूसरे gremlins से बहुत feedback इकट्ठा करके design किया है”

अजीब operator system

  • Raku Unicode operators का सक्रिय रूप से उपयोग करता है
    • set membership से check की जाती है
    • , , भी हैं
  • alphanumeric infix operators की भी अनुमति है
    • string repetition operator x है
    • function composition o है
  • list combinations भी छोटे symbols से व्यक्त होते हैं
    • X lists का Cartesian product बनाता है
    • Xf Cartesian product के हर element पर f लागू करता है
    • Zf zip तरीके से यही काम करता है
  • infix operator f के लिए [f] list को reduce करता है, और [\f] accumulated results बनाता है
    • [+] <1 2 3 4 5> का परिणाम 15 है
    • [\+] <1 2 3 4 5> का परिणाम (1 3 6 10 15) है

~~ matcher और ... sequence

  • ~~ कई तरह की comparisons को एक ही syntax में संभालने वाला matcher है
    • "abc" ~~ "abc" string match check करता है
    • "abc" ~~ Str check करता है कि यह string type है या नहीं
    • "abc" ~~ {.chars == 3} check करता है कि length 3 है या नहीं
    • "abc" ~~ /^b/ check करता है कि abc की शुरुआत b से होती है या नहीं
  • ... पहले के values से pattern पकड़कर sequence बनाता है
    • 0,1,2...10 0 से 10 तक 1-1 करके बढ़ता है
    • 0,2,4...10 even sequence बन जाता है
    • 1,2,4...10 1 2 4 8 जैसा बढ़ने वाला pattern follow करता है

user-defined operators

  • Raku कुछ भाषाओं की तरह सिर्फ infix operators define करने तक सीमित नहीं है; इसमें circumfix और postcircumfix operators भी बनाए जा सकते हैं
  • उदाहरण के लिए, sub circumfix:<[∀ zz>($inner){sum($inner)} जैसे wrapping operator को define करके अंदर की values का sum निकाला जा सकता है
  • vector dot product जैसा दिखने वाला postcircumfix operator भी define किया जा सकता है
    • sub postcircumfix:<| ⟩>(@left, @inside){[+] (@left Z* @inside)}
    • <1 2 3>|<4 5 6>⟩ का परिणाम 32 है
  • operator associativity भी कई तरीकों से तय की जा सकती है
    • सामान्य left-associative और right-associative infix operators define किए जा सकते हैं
    • chain associativity तय की जा सकती है, जहां x < y < z को x < y && y < z की तरह interpret किया जाता है
    • list associativity भी supported है, जिसमें a op b op c का मतलब op(a, b, c) होता है

multiple dispatch और runtime condition branching

  • Raku multiple dispatch support करता है, यानी अलग-अलग type signatures वाली कई function definitions में से सही वाली चुनता है
  • उदाहरण function f arguments के combination के हिसाब से अलग तरह से काम करता है
    • scalar और array मिलने पर array के हर element में scalar जोड़ता है
    • array और scalar वाला case भी support करता है
    • दो arrays मिलने पर Z+ से हर element को जोड़ता है
  • और भी खास बात यह है कि values के runtime predicates से भी dispatch किया जा सकता है
    • multi my_abs(Int $x where {$x > 0}) {$x}
    • multi my_abs(Int $x) {-$x}
  • function signature first-class value है, और signature के अंदर के parameters भी first-class values हैं

छोटी-छोटी features से बनता बड़ा surface area

  • MAIN function define करने पर उसके parameters अपने-आप CLI flags में बदल जाते हैं
  • objects में पहले से बहुत सारे methods दिए जाते हैं
    • List object सभी permutations, सभी k-combinations और सभी sliding windows पाने के methods देता है
  • Junctions एक बार में कई comparisons करने के लिए एक अनोखा value form है
    • 1|2 any(1, 2) में expand होता है, इसलिए 1 < 1|2 true होता है
    • 1&2 all(1, 2) में expand होता है, इसलिए 1 !< 1&2 true होता है
  • किसी भी infix operator के आगे ! लगाकर उसे negation operator बनाया जा सकता है
  • Raku ऐसी भाषा दिखती है जिसमें $kebab-case names और infix subtraction दोनों हैं; लगता है sigil x-y को अलग पहचानने में मदद करता है
  • regex syntax Perl 5 के साथ backward compatible नहीं है
    • 30 साल तक भाषाओं ने PCRE “standard” को follow किया, लेकिन Perl 6 ने इसे छोड़ दिया

अब तक न देखे गए हिस्से और छोटे पैमाने पर आकर्षण

  • यहां देखी गई चीजें calculator use case पर केंद्रित कुछ features भर हैं
  • अभी object system, packages और grammars नहीं सीखे हैं
  • function body में samewith उसी function को नए arguments के साथ फिर से call करता है—ऐसी बहुत-सी features अभी छूट गई हैं
  • अगर Raku legacy codebase maintain करना पड़े तो यह बहुत कठिन लगता है, लेकिन In The Small programming के लिए यह powerful दिखता है
    • one-off scripts
    • calculations
    • personal tools
    • शुरुआत में जिस तरह के काम चाहिए थे

शिकायतें और उम्मीदें

  • documentation बहुत कम है, और symbols पर निर्भरता ज्यादा होने से search करना मुश्किल है
    • कम documentation वाली कई languages सीखने का अनुभव होने के बावजूद, Raku उनसे कहीं ज्यादा बड़ा और जटिल है, जिससे motivation कम हो सकता है
  • Windows पर REPL में Unicode input करने पर crash हो जाता है
  • compiler भी काफी धीमा है; छोटी files में भी 0.5 सेकंड से ज्यादा लगता है, जिससे repetitive work दर्दनाक हो जाता है
  • sigil system असुविधाजनक है
    • एक case में @x की जगह $x लिखने से issue debug करने में 30 मिनट लग गए
  • कुल मिलाकर Raku पसंद आती है और इसके सफल होने की उम्मीद है, लेकिन समय के साथ compile time और documentation में सुधार की अपेक्षा है

1 टिप्पणियां

 
GN⁺ 2023-08-09
Hacker News की टिप्पणियां
  • अगर programming languages को 2D space में रखा जाए, तो axes हो सकते हैं: कितना चौंकाती है और चौंकने पर वह मज़ेदार है/भयानक है
    सामान्य languages से आम तौर पर अनकही उम्मीद होती है कि वे नीचे-बाएं हिस्से में हों—“लगभग चौंकाती नहीं, लेकिन कभी-कभार चौंकाए तो मज़ेदार हो”. Raku दुर्लभ खाली पड़े ऊपर-बाएं हिस्से को खुलकर target करती लगती है. उसका attitude कुछ ऐसा है: “अजीब है न? कूल नहीं है?”

    • दिक्कत यह है कि वे axes subjective हैं. कोई चीज़ मज़ेदार और भयानक दोनों हो सकती है; मैंने पहले document.write = function ... जैसा JavaScript लिखा है, और जिस काम की ज़रूरत थी वह हो गया इसलिए वह मज़ेदार था, लेकिन साथ ही काफ़ी भयानक भी था
    • जब university assignment में parser बनाना था, तब Raku की grammar feature के बारे में पता चला, और उसने लगभग सब कुछ मेरे लिए कर दिया, इसलिए cheat code जैसा लगा, लेकिन फिर भी मज़ा आया
    • यह मूल रूप से Perl 6 था, इसलिए यह चौंकाने वाली बात नहीं कि Perl developers ऐसी language चाहते थे जो दूसरी languages जैसी बिल्कुल न लगे
      Perl में भी “मज़ेदार surprises” बहुत थे, और मेरी नज़र में Raku का design ज़्यादातर Perl के भयानक surprises हटाने के लिए था
    • से set membership check करने वाली बात देखकर समझ गया कि मतलब क्या है
      0,2,4...10 से (0 2 4 6 8 10) बनता है, लेकिन 1,2,4...10 से (1 2 4 8) बनना ऐसा लगता है जैसे “क्या यह OEIS में अगला number ढूंढ रहा है?”
    • Paragraphs आगे बढ़ते गए तो Raku धीरे-धीरे ऊपर-दाएं, यानी चौंकाने वाले और भयानक zone में जाती दिखी
  • Raku language के तौर पर दिलचस्प है, लेकिन कुछ idioms दिमाग में आसानी से नहीं बैठते
    AppleScript के natural language जैसा दिखने की कोशिश में अजीब लगने जैसा ही, इसमें my, say, sub, gather जैसे natural-language-style elements, @ जैसे symbols, module declarations और outsiders को Byzantine लगने वाले syntax decisions मिले-जुले हैं. 99 bottles वाला example भी logically follow किया जा सकता है, लेकिन intuitively discover करना मुश्किल है. Symbols ज़्यादा हैं और context के हिसाब से overloaded लगते हैं, इसलिए natural language parser जैसे कामों में भी, जहां Raku optimal हो सकती है, मैं इसे खुद इस्तेमाल नहीं करना चाहूंगा
    https://examples.raku.org/categories/module-management/Fletc...

    • लगता है आपने Perl नहीं किया है. Perl background हो तो उस syntax का काफ़ी हिस्सा, खासकर array बताने वाला @ sigil, काफ़ी familiar लगता है
    • Bash देखते समय भी बिल्कुल ऐसा ही लगता है
  • Raku में मेरी सबसे पसंदीदा feature यह है कि integer division और decimal literals दोनों rational number type Rat return करते हैं
    सबको पता है कि floating point बहुत अच्छा नहीं है, लेकिन सच में उससे दूर जाने की कोशिश करने वाली languages बहुत कम हैं, और Raku में floating-point literal तभी बनता है जब scientific notation इस्तेमाल करें

    • Common Lisp और Scheme जैसी पुरानी languages भी IEEE 754 floating point को नापसंद करने वालों के नोटिस करने का इंतज़ार कर रही हैं
      इनके पास rational numbers और complex rational numbers तक शामिल करने वाली numeric hierarchy है, और arbitrary precision numbers भी स्वाभाविक रूप से support होते हैं. Composability शानदार है
    • यह असल में खराब feature के करीब है. क्योंकि Rat representation बहुत बड़ा हो जाए तो यह अपने-आप floating point में बदल जाता है
      1/10 Rat है, लेकिन 1/100000000000000000000 Num बन जाता है. Promote न होने वाला FatRat भी है, लेकिन default नहीं है
    • Scheme की numeric hierarchy ने exact representations को दशकों से सही तरह handle किया है
      इसलिए इसे “implicit inaccurate floating point इस्तेमाल करने के तरीके से बाहर आना” कहने के बजाय, यह कहना सही होगा कि वह कभी उस हालत में था ही नहीं
    • Racket भी अलग बात कहेगा. यह सही काम करता है
      (/ 1.0 3.0) 0.3333333333333333 है, (/ 1 3) 1/3 है, और (- (+ 0.1 0.2) 0.3) 5.551115123125783e-17 बनता है
    • मुझे यकीन नहीं कि यह अच्छा है. मुझे पता है decimal/rational types और floating point कब इस्तेमाल करने चाहिए, लेकिन मेरे personal Python code में Decimal() की तुलना में float() calls कहीं ज़्यादा हैं
      अगर सीधे पैसे handle नहीं कर रहे हैं, तो लगभग हमेशा floating point ही वह choice है जो आप चाहते हैं
  • मुझे Raku documentation “वाकई बहुत खराब” नहीं लगी; उल्टा official docs site concept docs और API docs दोनों रखने वाला one-stop resource होने की वजह से impressive लगा
    https://docs.raku.org/
    Concept docs के starting point के लिए यह page बहुत अच्छा है: https://docs.raku.org/language

    • मैं कई सालों से Raku इस्तेमाल कर रहा हूं, और docs शानदार भी हैं और अधूरे भी
      मौजूद content का अधिकतर हिस्सा अच्छी तरह लिखा है और useful example code भी है, लेकिन कभी-कभी ऐसे हिस्से मिलते हैं जो बिल्कुल document नहीं किए गए हैं या सिर्फ simple cases cover करते हैं. Module system खास तौर पर सबसे बड़ा issue था, और module/package का distinction सिर्फ Modules page पढ़कर समझना मुश्किल है. Imported namespace और declared namespace अलग हो सकते हैं, लेकिन compiler को ढूंढना हो तो directory structure को namespace से match करना पड़ता है—यह useful है और अजीब तरह से समझ में भी आता है, लेकिन मुझे इसे खुद try करके सीखना पड़ा
    • यह Perl culture की वजह से है. Perl FAQ और manual pages, Perl इस्तेमाल करने वाले programmers की प्रवृत्ति के कारण top-tier थे—witty, concise और विचित्र
    • Perl manual pages हमेशा शानदार रहे हैं
  • Raku के सारे cool Unicode operators के लिए ASCII alternatives हैं
    उदाहरण के लिए , , , के alternatives (elem), !(elem), (cont), !(cont) हैं
    https://docs.raku.org/language/unicode_ascii#Other_acceptabl...

    • मैं तो निश्चित रूप से ASCII version ही इस्तेमाल करूंगा
  • भाषा को ठीक से जानने से पहले आने वाली आम आलोचना अब भी दोहराई जा रही लगती है। पहले Perl का “लाइन नॉइज़” था, और अब कहा जाता है कि Raku बेझिझक Unicode operators इस्तेमाल करता है
    लेकिन यह वैकल्पिक है, और स्क्रीन पर code को छोटा और expressive दिखाने के लिए मैंने खुद इन्हें इस्तेमाल करके देखा है। सोच-समझकर और creative तरीके से Unicode इस्तेमाल करने के लिए यह अच्छा बैठता है। sigil पसंद न आने वाली प्रतिक्रिया भी आम है, लेकिन Perl की Swiss Army chainsaw जैसी expressiveness पसंद होने की वजह से मैं Raku/Perl 6 इस्तेमाल करता आया हूं, और Raku ऐसा लगता है जैसे Perl को और भी ज्यादा Perl बना दिया गया हो। यह व्यवस्थित है, expressive है, और अच्छे पुराने Perl के ऊपर features का एक विशाल ढेर चढ़ा है। documentation भी अच्छी है, हालांकि उसे लगातार सुधारने की जरूरत है, और Perl documentation से तुलना करें तो benchmark बहुत ऊंचा है

    • non-ASCII operators कैसे type किए जाते हैं, यह जानने की उत्सुकता है। कोई special keyboard layout है, editor किसी खास sequence को auto-convert करता है, या raw Unicode escape इस्तेमाल करते हैं—पता नहीं
      कुछ characters बचाने के लिए ऐसा करना जटिल और खास मायने वाला नहीं लगता
  • कभी-कभी सोचता था कि syntax sugar से भरी programming language कैसी दिखेगी; अब पता चल गया
    एहसास कुछ ऐसा है: “भयानक है, मगर अजीब तरह से खींचती है; नजर नहीं हटती; और दिखाओ”

    • शायद आपको हाल के कई Advent of Code जीतने वाले व्यक्ति की बनाई hobby language noulith पसंद आए
      GitHub intro में लिखा है, “slaps roof of [programming language]* this bad boy can fit so much [syntax sugar] into it.” सबसे हालिया Advent of Code में भी उन्होंने इसी language का इस्तेमाल करके जीत हासिल की: https://github.com/betaveros/noulith
    • Raku के Grammars के बारे में जानने तक इंतजार कीजिए
    • modern C++ देखते ही हर बार मेरी यही प्रतिक्रिया होती है
  • यह याद रखने लायक है कि Raku मूल रूप से Perl 6 के तौर पर शुरू हुआ था, और उसके कई design philosophies Perl-style सोच से निकले हैं
    string repetition के लिए x operator पर तुरंत प्रतिक्रिया देखकर लगता है कि लेखक Perl और Raku के इतिहास से अच्छी तरह परिचित नहीं हैं, क्योंकि Perl में यह दशकों से ऐसा ही रहा है

    • लेख में वाक्य है, “regex syntax Perl 5 के साथ backward compatible नहीं है। 30 साल तक languages PCRE ‘standard’ का पालन करती रहीं, लेकिन Perl 6 ने बस सब छोड़ दिया”, इसलिए लगता है कि कम से कम कुछ हद तक जानकारी तो है
    • पहले footnote में लिखा है कि Raku को पहले Perl 6 के नाम से जाना जाता था
    • “Perl6/Raku, Perl 5 से पूरी तरह अलग है” वाला दावा बहुत बढ़ा-चढ़ाकर कहा गया है
      इसे यूं ही Perl 6 नहीं कहा गया था, और लगभग उसी Perl team ने इसे develop किया था। जिसने Perl 5 ठीक-ठाक इस्तेमाल किया है, उसे Perl6/Raku की विरासत साफ दिखेगी। Raku का पूरा object model भी CPAN के Perl 5 module Moose.pm के थोड़े ज्यादा powerful version जैसा ही है
  • सच कहूं तो Perl 5/PCRE regex syntax भयानक है
    उसके मौजूद होने की वजह भी बस यह थी कि पुराने regex syntax में (? syntax error था, इसलिए उसे किसी भी मतलब में redefine किया जा सकता था। Raku, अब जब हमें पता है कि regex को क्या express करना चाहिए, शुरुआत से एक sane regex language design करने की कोशिश है। विकल्प यह है कि अगले 30 साल और (?:this|(?>or that)) जैसी चीजों में फंसे रहें

    • भयानक से ज्यादा यह समझ से परे black magic है, और समझ आने के बाद कमाल लगती है
      Perl को छुए काफी समय हो गया, लेकिन regex अब भी अक्सर इस्तेमाल करनी पड़ती है
    • सहमत हूं, लेकिन यह वाकई बहुत उपयोगी है
  • एक खास अर्थ में यह निश्चित रूप से gremlin है। मुझे अजीब और जटिल, मगर productivity बढ़ाने वाले tools पसंद हैं
    हालांकि “बड़े program vs छोटे program” वाली तुलना से सहमत नहीं हूं। कोई कम समझदार व्यक्ति इसे इस तरह ले सकता है कि यह बड़े कामों के लिए खराब language है, जबकि असल में यह दूसरी languages जितनी अच्छी या उनसे बेहतर भी हो सकती है। समस्या यह है कि बाकी gremlin languages की तरह, इसे ठीक से इस्तेमाल करने के लिए बुद्धिमानी चाहिए। उदाहरण के लिए $x और @x में गड़बड़ करना उन लोगों में लगभग नहीं होता जिन्होंने मिलती-जुलती languages पर्याप्त इस्तेमाल की हों। sigil code पढ़ते समय variable का सरल type—और Raku में interface—तुरंत बता देता है, इसलिए उलटे सुविधा देता है, और एक ही variable namespace को अलग sigil के साथ उपयोगी ढंग से इस्तेमाल किया जा सकता है। यह अजीब दिखता है, अनावश्यक अक्षर जैसा लगता है, और इसका अर्थ जानना पड़ता है, लेकिन जीवन आसान बना सकता है: https://www.perl.com/article/on-sigils/
    समस्या उन लोगों के साथ होती है जिन्हें ठीक से पता नहीं कि वे क्या कर रहे हैं। ऐसे लोगों के लिए यह gremlin language जीता-जागता nightmare हो सकती है, और उन्हें bowling bumpers, swimming tubes, Kevlar gloves, hard hats, GPS जैसे बहुत सारे protective gear चाहिए। इसका मतलब यह नहीं कि gremlin language से skyscraper नहीं बनाया जा सकता; बस accident-prone non-gremlin नहीं बना पाएंगे, जबकि समझदार gremlin बना सकते हैं

    • “यह tool सिर्फ काफी अच्छे लोग ही इस्तेमाल कर सकते हैं” वाली सोच मुझे एक बड़ा design smell लगती है
      tools इसलिए होते हैं कि team अपना जरूरी काम बेहतर या तेजी से कर सके। अगर juniors को छांटने या अपना ego बढ़ाने के लिए कोई अनावश्यक रूप से जटिल tool इस्तेमाल किया जा रहा है, तो वह tool संगठन के बाकी लोगों के लिए मदद से ज्यादा हथियार जैसा है