असाधारण प्रोग्रामिंग भाषा Hurl
(hurl.wtf)- Hurl एक experimental programming language है, जिसमें सामान्य branching या loop के बजाय सिर्फ exception handling से control flow बनाया जाता है
- इसकी शुरुआत Nicole Tietz-Sokolskaya और Recurse Center के दोस्तों के बीच हुई बातचीत से हुई, और साइट usage docs, examples, debugging guide और सवाल-जवाब भी देती है
- introduction page के testimonials में “monstrosity is beautiful”, “Certified unhinged™” जैसी पंक्तियों के जरिए जानबूझकर मजाकिया माहौल को सामने रखा गया है
- Hurl और साइट का source code सार्वजनिक है, लेकिन email patch भेजने के लिए patch rights assignment जरूरी है
- license AGPL-3.0, GAL-1.0 और commercial license में से किसी एक को चुनने के तरीके से उपलब्ध है
सिर्फ exception handling छोड़ देने वाला भाषा प्रयोग
- Hurl को एक ही मकसद से बनाया गया है: यह तलाशना कि क्या exception handling-based control flow से बनी भाषा संभव है
- idea Nicole Tietz-Sokolskaya और Recurse Center के दोस्तों की बातचीत से आया, और दोस्तों की पहचान “शालीनता के लिए” सार्वजनिक नहीं की गई है
- साइट Hurl usage docs, examples, debugging guide, और सवाल-जवाब उपलब्ध कराती है
मजाक जैसा दिखता है, लेकिन सच में publicly released project
- introduction page पर Hurl के स्वभाव को दिखाने वाले testimonials दिए गए हैं
- “This monstrosity is beautiful, and I must never touch it”
- “Certified unhinged™!”
- “is "🤮" an available quote?”
- अगर आप अतिरिक्त testimonial शामिल कराना चाहते हैं, तो Nicole को email भेजना होगा, और quote शामिल करने के लिए स्पष्ट सहमति जरूरी है
source code और license terms
- Hurl language और इस site का source code Hurl's repo पर सार्वजनिक है
- अगर कोई bug या error मिलता है, तो email patch भेज सकते हैं, लेकिन patch के सभी rights सौंपने होंगे
- यह relicensing और commercial licensing की संभावना बनाए रखने की शर्त है
- project को नीचे दिए गए तीन licenses में से किसी एक के तहत इस्तेमाल किया जा सकता है
-
AGPL-3.0
- GAL-1.0: Gay Agenda License
- commercial license
- license review प्रक्रिया में joke licenses और unfortunate licenses पर भी विचार किया गया, लेकिन अंततः ऊपर दिए तीन licenses इस्तेमाल किए गए
-
1 टिप्पणियां
Hacker News की रायें
अगर कोई programming language डिजाइन कर रहा हो, तो include/import में namespace अनिवार्य करना और हो सके तो top-level side effects भी रोकना बेहतर होगा
let foo = include "lib/foo.hurl"की तरह लेकरfoo.init()कॉल करें, तो reasoning करना कहीं आसान हो जाता हैइसके उलट
include "lib/foo.hurl" // side effectsके बादbaz(buz)आए, तो यह समझना मुश्किल होता है कि functions और variables standard library से हैं या कहीं से include किए गए हैंimport "foo/bar"सेfoo.*याbar.*इस्तेमाल हो सकना चाहिए,bazz.*नहीं आना चाहिए। Go तुरंत याद आता हैVSCode भी plugins और LSP से कुछ ऐसा ही करता है, लेकिन काफी कमजोर है। Code navigation इतनी धीमी है कि VSCode में काम नहीं कर सकता
सोचता हूं कि ऐसी सलाह सिर्फ तब उपयोगी है जब ऐसे tools न हों। कम से कम professional environment में ऐसे tools के बिना रहना असंभव लगता है
foo.init()में parameters pass किए जा सकते हैं, जबकि bare import से यह संभव नहीं होताइसका मतलब यह नहीं कि यह project बेकार है; बल्कि मैं इसे एक कलाकृति मानता हूं
मैंने कभी Ruby को fork करके
requireको symbol table overwrite न करने वाला बनाया था, लेकिन लगा कि Ruby ecosystem shared global mutable state पर बहुत ज्यादा निर्भर है, और अंततः Ruby में ही रुचि खत्म हो गईExceptions हमेशा खराब लगे, क्योंकि वे caller और callee के बीच का contract समझना कठिन बनाते हैं और code coupling भी बढ़ाते हैं
मुझे Go या Rust की तरह return values से handle करने का तरीका पसंद है। भाषा को सरसरी तौर पर देखने पर नहीं पता कि इसमें इस समस्या को हल करने वाली कोई चीज है या नहीं
अगर IDE किसी function की सभी uncaught exceptions को dynamically पता लगा सके और जहां exception throw हो सकती है वहां jump करा सके, तो ऐसा model ठीक हो सकता है। हालांकि coupling को कैसे संभालेगा, यह नहीं पता, और control flow graph बेहद अस्थिर हो जाएगा लगता है
हालांकि Java में, जब तक वह
RuntimeExceptioninherit नहीं करता, function जो exceptions throw कर सकता है वे function signature का हिस्सा होती हैं। ऐसे में signature में जोड़े बिना exception throw करने पर compile नहीं होताJava की स्थितियां IDE के लिए uncaught exceptions report करना बहुत आसान बना देती हैं, लेकिन non-runtime exceptions के मामले में यह static analysis से हल होने वाली समस्या है
दूसरी ओर standardized
Ok/Errwrapped values return करने का तरीका tooling support और developer convenience दोनों के लिहाज से सरल लगता हैफर्क सिर्फ इतना है कि exception propagation वाले तरीके में compiler जो boilerplate code कर देता, उसे आपको हाथ से लिखना पड़ता है
2024 में ठीक से काम करने वाले दिमाग वाला कोई व्यक्ति यह हाथ से क्यों करना चाहेगा, यह मेरी समझ से बाहर है
जितना मैंने इस्तेमाल किया, उसमें debugger के बिना root cause ढूंढना कहीं ज्यादा दर्दनाक था
tossexample में लिखा है कि “यह function के बाहर कई values pass करने के लिए मुख्य रूप से इस्तेमाल होता है, जरूरी नहीं है पर cute है”, लेकिन यह बेकार तो दूर, resumable generator लागू करता हैबेशक तुरंत resume करने के अलावा कुछ और करवाना हो तो यह काफी दिलचस्प हो सकता है। बस पूरी codebase को
tossके inner-outer stacks के रूप में बनाना होगाreturnको handler की ओर lexically scoped होना पड़ता हैउदाहरण के लिए Python में कहीं से भी
next()call कर सकते हैंयह side channel से callback pass करने जैसा ज्यादा है।
tossउस callback को call करता है, औरreturnसचमुच वहीं से return करता हैदूसरी languages में जो सचमुच उपयोगी feature होता, उसे यहां discard की जा सकने वाली cute feature की तरह treat करना थोड़ा joke जैसा लगा
yieldजैसा है?Hurl, Smalltalk या Common Lisp शैली के condition system के काफी करीब लगता है
stack unwinding और resumption संभावित restarts में से सिर्फ दो हैं: https://gigamonkeys.com/book/beyond-exception-handling-condi...
project से अलग, मेरा पक्का मानना है कि अगर ज्यादा चीजें domains में .wtf extension इस्तेमाल करें, तो दुनिया बेहतर हो जाएगी
यह algebraic effects का कमजोर रूप जैसा सुनाई देता है, लेकिन ऐसी language और उससे क्या किया जा सकता है, यह देखना फिर भी शानदार है
अगर algebraic effects मूल रूप से Hurl के
tosskeyword जैसी चीज हैं, तो सोचता हूं कि वेtossसे किस तरह ज्यादा शक्तिशाली हैंमजेदार thought experiment है
मुझे exceptions सच में नापसंद हैं, और मैं ऐसी language चाहता हूं जिसमें exceptions न हों
exceptions हमारे दौर का
gotoहैंजब
Maybe/OptionऔरEffect/Resultमौजूद हैं, तो exceptions throw करने और वे कहां handle होंगी यह दिमाग में track करने की बहुत कम वजह बचती हैथोड़ा डर है कि algebraic effects और popular हो जाएं और पहले से ही बहुत complex frontend JS पर भी असर डालें। क्योंकि वे flow control के लिए “exceptions” throw करने के तरीके को encourage करते हैं
अगर यह सब async/sync color problem से बचने के लिए है, तो निजी तौर पर मेरे लिए यह बिल्कुल worth नहीं है
वाह, यह मुझे पसंद नहीं। लेकिन अजीब तरह से इसमें लगभग elegance है
दिमाग में model करना बहुत मुश्किल है, फिर भी
थोड़ा गंभीर होकर कहूं तो resumable exceptions और non-resumable exceptions के लिए syntax के स्तर पर अलग
catchconstructs होते, तो अच्छा होता। इससे यह syntactic ambiguity खत्म हो जाती किreturncontrol flow को nearest immediate exception के thrower की ओर वापस भेजता है या नहींऔर standard library को सामान्य value-returning functions की ओर भागना नहीं चाहिए। अपना बनाया हुआ खाना खाकर acidity हो जाए, तो उसे न खाने की वजह नहीं बनती
क्या मेरी समझ सही है कि
hurlकी गई चीज catch की जा सकती है, लेकिनtossकी गई चीज नहीं? इसकी आदत पड़ने में समय लगेगायह भी चिंता है कि मुझे कितना Hurl लिखना पड़ेगा, तब लोग मुझे tosser कहना शुरू करेंगे
Tossएक दिलचस्प language construct जैसा लगता है। यह stack पर ऊपर चढ़कर exception handler ढूंढता है, फिर मूल जगह पर लौटकर ऐसे execution resume करता है जैसे कुछ हुआ ही न होइस construct से runtime पर additional behavior inject किया जा सकता है लगता है
आम तौर पर object-oriented code में service constructors के जरिए dependency injection किया जाता है, लेकिन क्या
toss“toss handler” के जरिए यह संभव बनाता है?https://koka-lang.github.io/koka/doc/book.html#why-handlers
मुझे बहुत ज्यादा जानकारी नहीं है, लेकिन इतना पता है कि यह runtime पर behavior इस तरह inject करने देता है
Resume Nextजैसा है