Sıradışı programlama dili Hurl
(hurl.wtf)- Hurl, genel dallanma veya döngüler yerine yalnızca istisna işleme ile kontrol akışını kurgulayan deneysel bir programlama dili
- Nicole Tietz-Sokolskaya ile Recurse Center’daki arkadaşlarının sohbetinden doğdu; site kullanım belgeleri ve örneklerin yanı sıra hata ayıklama kılavuzu ile soru-cevap bölümü de sunuyor
- Tanıtım sayfasındaki alıntılar, “monstrosity is beautiful”, “Certified unhinged™” gibi ifadelerle bilinçli olarak şakacı bir havayı öne çıkarıyor
- Hurl ve sitenin kaynak kodu açık, ancak e-posta ile yama göndermek için yama haklarını devretmek gerekiyor
- Lisans, AGPL-3.0, GAL-1.0 veya ticari lisans seçeneklerinden biri olarak sunuluyor
Yalnızca istisna işlemenin kaldığı bir dil deneyi
- Hurl tek bir amaç için oluşturuldu: istisna işleme tabanlı kontrol akışından oluşan bir dilin mümkün olup olmadığını araştırmak
- Fikir, Nicole Tietz-Sokolskaya ile Recurse Center’daki arkadaşlarının sohbetinden çıktı; arkadaşlarının kimlikleri “nezaket gereği” açıklanmıyor
- Site, Hurl kullanım belgeleri ve örneklerinin yanı sıra hata ayıklama kılavuzu ve soru-cevap bölümü sunuyor
Şaka gibi görünse de gerçekten açık bir proje
- Tanıtım sayfasında Hurl’ün karakterini yansıtan alıntılar yer alıyor
- “This monstrosity is beautiful, and I must never touch it”
- “Certified unhinged™!”
- “is "🤮" an available quote?”
- Ek alıntılar yayımlatmak isterseniz Nicole’e e-posta göndermeniz ve alıntının dahil edilmesine açıkça onay vermeniz gerekiyor
Kaynak kodu ve lisans koşulları
- Hurl dili ve bu sitenin kaynak kodu Hurl's repo üzerinde açık olarak yayımlanıyor
- Bir hata veya yanlışlık bulursanız e-posta ile yama gönderebilirsiniz; ancak yamaya ilişkin tüm hakları devretmeniz gerekiyor
- Bu, yeniden lisanslama ve ticari lisans olasılığını korumak için bir koşul
- Proje aşağıdaki üç lisanstan biriyle kullanılabiliyor
-
AGPL-3.0
- GAL-1.0: Gay Agenda License
- ticari lisans
- Lisans inceleme sürecinde joke licenses ve unfortunate licenses da değerlendirildi, ancak sonuçta yukarıdaki üç lisans kullanıldı
-
1 yorum
Hacker News yorumları
Bir programlama dili tasarlıyor olsaydım include/import için namespace zorunlu kılar, mümkünse en üst düzey yan etkileri de engellerdim.
let foo = include "lib/foo.hurl"gibi alıpfoo.init()çağırmak çıkarım yapmayı çok daha kolaylaştırır.Buna karşılık
include "lib/foo.hurl" // side effectsardındanbaz(buz)gelirse, fonksiyonların ve değişkenlerin standart kütüphaneden mi yoksa bir yerden include edilmiş mi olduğunu anlamak zorlaşır.import "foo/bar",foo.*veyabar.*kullanılmasını sağlamalı;bazz.*ortaya çıkmamalı. Aklıma tam Go geliyor.VSCode da eklentiler ve LSP ile benzerini yapıyor ama çok daha kötü. Kodda gezinme o kadar yavaş ki VSCode ile çalışamam.
Bu tür önerilerin yalnızca böyle araçlar yokken mi işe yaradığını merak ediyorum. En azından profesyonel ortamda böyle araçlar olmadan yaşamak imkânsız görünüyor.
foo.init()'e parametre geçebilirsiniz; çıplak import ile bu mümkün değil.Bu projenin değersiz olduğu anlamına gelmiyor; aksine onu bir sanat eseri olarak görüyorum.
Bir keresinde Ruby'yi fork edip
require'ın sembol tablosunun üstüne yazmamasını sağlamaya çalışmıştım; ama Ruby ekosisteminin paylaşılan global değişken duruma aşırı bağımlı olduğunu düşünüp sonunda Ruby'nin kendisine ilgimi kaybettim.İstisnalar, çağıran ile çağrılan arasındaki sözleşmeyi anlamayı zorlaştırıyor ve kodun bağlılığını da artırıyor; bu yüzden bana hep kötü geldi.
Go veya Rust'taki gibi dönüş değeriyle ele alma biçimini tercih ederim. Dili kabaca incelediğimde bu sorunu çözen bir unsur var mı pek emin olamadım.
IDE bir fonksiyonun yakalanmamış tüm istisnalarını dinamik olarak bulup istisnanın fırlatılabileceği yerlere atlamayı sağlarsa bu model de kabul edilebilir olabilir. Ama bağlılığın nasıl ele alınacağını bilmiyorum; kontrol akışı grafiği de aşırı kırılgan hâle gelecek gibi.
Ancak Java'da,
RuntimeException'dan türemediği sürece bir fonksiyonun fırlatabileceği istisnalar fonksiyon imzasının parçasıdır. Böyle bir durumda imzaya eklemeden istisna fırlatırsanız derlenmez.Java'nın koşulları, IDE'nin yakalanmamış istisnaları raporlamasını çok daha kolaylaştırıyor; ama runtime istisnası değilse statik analizle çözülebilecek bir problem.
Öte yandan standartlaştırılmış
Ok/Errsarmal değerleri döndürme yaklaşımı, hem araç desteği hem geliştirici konforu açısından daha basit görünüyor.Tek fark, istisna iletme yaklaşımında derleyicinin sizin yerinize yazacağı kalıp kodu elle yazmak zorunda kalmanız.
2024'te düzgün çalışan bir kafaya sahip birinin bunu neden elle yapmak isteyeceğini gerçekten anlayamıyorum.
Kullandığım süre boyunca, debugger olmadan kök nedeni bulmak çok daha acı vericiydi.
tossörneği “çoğunlukla fonksiyon dışına birden fazla değer aktarmak için kullanılır; şart değil ama sevimli” diye anlatılmış, oysa gereksiz olmak bir yana sürdürülebilir generator'ları gerçekleştirmiş oluyor.Elbette hemen sürdürmek dışında başka bir şey yaptırmak isterseniz oldukça ilginç olabilir. Tüm codebase'i
toss'un iç-dış yığını olarak kurmanız yeterli.return'ün işleyici tarafında leksik olarak scope'lanmış olması gerekir.Örneğin Python'da
next()'i her yerden çağırabilirsiniz.Bu daha çok yan kanaldan callback geçirmek gibi.
tosso callback'i çağırır;returnde kelimenin tam anlamıyla oradan döner.Başka bir dilde gerçekten kullanışlı olacak bir özelliğin burada atılabilir sevimli bir özellik gibi ele alınması biraz şaka mı diye düşündürüyor.
yieldgibi bir şey mi?Hurl, Smalltalk veya Common Lisp tarzı condition system'a epey yakın görünüyor.
Stack unwinding ve sürdürme, olası restart'lardan yalnızca ikisi: https://gigamonkeys.com/book/beyond-exception-handling-condi...
Projenin kendisinden bağımsız olarak, daha fazla şeyin alan adında .wtf uzantısını kullanması hâlinde dünyanın daha iyi bir yer olacağına kuvvetle inanıyorum.
Bu, cebirsel etkilerin zayıf bir biçimi gibi geliyor; yine de böyle bir dili ve onunla neler yapılabileceğini görmek harika.
Cebirsel etkiler temelde Hurl'ün
tossanahtar sözcüğü gibi bir şeyse,toss'tan hangi açıdan daha güçlü olduğunu merak ediyorum.Eğlenceli bir düşünce deneyi.
İstisnalardan gerçekten nefret ediyorum ve istisnasız bir dil istiyorum.
İstisnalar çağımızın
goto'su.Maybe/OptionveEffect/Resultvarken, istisna fırlatıp nerede ele alındığını zihinde takip etmek için pek sebep yok.Cebirsel etkilerin daha popülerleşip zaten fazlasıyla karmaşık olan frontend JS'i de etkilemesinden biraz endişeliyim. Çünkü akış kontrolü için “istisna” fırlatma yaklaşımını teşvik ediyor.
Bütün bunların amacı asenkron/senkron renk problemini önlemekse, bana göre kesinlikle buna değmez.
Vay, bundan hoşlanmadım. Ama tuhaf biçimde neredeyse zarif bir yanı var.
Zihinde modellemesi çok zor, ama yine de öyle.
Biraz daha ciddi söylersem, sürdürülebilir istisnalar ile sürdürülemez istisnalar için sözdizimsel olarak farklı
catchifadeleri olmasını isterdim. O zamanreturn'ün kontrol akışını en yakın anlık istisnanın fırlatıldığı tarafa geri gönderip göndermediğine dair sözdizimsel belirsizlik ortadan kalkar.Ayrıca standart kütüphane sıradan değer döndüren fonksiyonlara kaçmamalı. Kendi pişirdiğini yiyince miden yanıyor diye yememek olmaz.
hurledilen şeylerin yakalanabildiğini amatossedilenlerin yakalanamadığını mı doğru anladım? Alışması biraz zaman alacak.Ayrıca ne kadar Hurl yazarsam insanların bana tosser demeye başlayacağından da endişeliyim.
Tossilginç bir dil yapısı gibi geliyor. Yığın üzerinde yukarı çıkarak istisna işleyicisini buluyor, sonra yeniden asıl konuma dönüp hiçbir şey olmamış gibi yürütmeyi sürdürüyor.Bu yapıyla runtime'da ek davranış enjekte etmek mümkün görünüyor.
Genellikle nesne yönelimli kodda bağımlılık enjeksiyonu servis constructor'ları üzerinden yapılır;
tossbunu “toss işleyicisi” ile mi mümkün kılıyor?https://koka-lang.github.io/koka/doc/book.html#why-handlers
Çok fazla bilmiyorum ama runtime'da davranışı bu şekilde enjekte etmeye izin verdiğini biliyorum.
Resume Next'ine benziyor.