Cognition: Metaprogramlamayı Yeniden Tanımlayan Yeni Bir Antisyntax Dili
(ret2pop.nullring.xyz)- Cognition, Lisp ve concatenative dillerdeki read-ahead sorununu önlemek için tamamen postfix antisyntax benimseyen bir dil araştırma projesidir
- Temel mekanizmalar olan delimiter, ignore, singlet, falias, crank ve metacrank; programların kendi tokenleştirme kurallarını ve yürütme döngülerini değiştirmesini sağlar
- Bootstrap, tüm karakterlerin tek birer token olarak okunduğu durumdan başlar ve kendi kendini boşluk ile satır sonunu ayırıcı olarak kullanan bir ortama taşır
crankvemetacrank, tokenların ne zaman değerlendirileceğini ve ne zaman biriktirileceğini kontrol ederek#yorumları,\\escape,[quote,(macro gibi prefix sözdizimini postfix bir sistem içinde tanımlamayı mümkün kılar- Brainfuck lehçesi de ayrı bir parser yerine Cognition sözcükleri ve tokenleştirme kuralları ile uygulanır; bu da sözdiziminin kendisini kod haline getirme ve otomatikleştirme yönünü gösterir
Mevcut sözdizimlerinde Cognition'ın sorun gördüğü noktalar
- Lisp, s-expression ve makro sistemiyle güçlü metaprogramlama sunar; ancak yine de sabit bir sözdiziminin etkisi altındadır
- Sol parantez, sağ parantez gelene kadar okunması gerektiğini bildiren bir sinyaldir; bu yüzden dilin içinden parantezin rolünü değiştirmek zordur ya da bazı uygulamalarda imkânsızdır
- Önceden okunmuş tokenların nasıl ayrıldığını sonradan değiştirmek için yoğun string işleme gerekir
- Mevcut girdiye bakıp devamını da okuma ihtiyacı doğuran süreç syntax olarak tanımlanır; temel düzeyde read-ahead varsayıldığı anda dil belirli sözdizimsel biçimlere bağlanır
- Cognition bunu önlemek için tamamen postfix çalışan antisyntax yaklaşımını kullanır
- Concatenative dillere benzer, ancak genel concatenative dillerin de köşeli parantezler veya string quote karakterleri nedeniyle read-ahead sorunu taşıdığı kabul edilir
- Racket'in makro sistemi, çalışma anında dinamik sözdizimi değişimi yerine ön işleme kullanan farklı bir yaklaşım olarak ayrılır
Proje ve temel fikir
- Cognition, Matthew Hinton ile birlikte birkaç ay boyunca yürütülen aktif bir araştırma projesidir
- Uygulama deposu cognition-rust adresindedir ve depoda dil üzerine yazılmış bir makale de bulunur
- Konuyu anlamak için parsing, tokenization ve grammar konularında arka plan bilgisi yardımcı olur
- Açıklama, “baremetal cognition” kodundan başlayıp Stem benzeri bir sözdizimine evrilen akışı izler
Baremetal Cognition ve tokenleştirme
- Baremetal Cognition, görünüş olarak Brainfuck'a benzer; ancak çok daha güçlü metaprogramlama yapabilir
- Son derece küçük bootstrap kodu, boşluk ve satır sonunu da anlamlı biçimde kullanır; başlangıçta tüm tekil karakterler token olarak okunur
- Cognition temelde stack tabanlı bir tasarıma sahiptir, ancak stack yerine daha genel bir anlam taşıyan container terimi kullanılır
- Varsayılan ortamda, özel falias dışında hiçbir sözcük otomatik olarak çalıştırılmaz
-
delimiter, ignore, singlet
- delimiter, tokenizer'ın bir tokenın nerede bittiğini ve sonrakinin nerede başladığını anlamasını sağlar
- Tek karakterli delimiter listesi Cognition kodunun içinden değiştirilebilir ve okunabilir
- Ignore karakterleri, her read-eval-print loop içinde token toplamanın başlangıç aşamasında atlanır
- Varsayılan durumda tüm karakterler delimiter, ignore karakterleri ise yoktur
- delimiter, singlet ve ignore listeleri whitelist/blacklist bayraklarıyla çalışma biçimini değiştirebilir
- Varsayılan ayar: blacklist delimiter yok, whitelisted singlet yok, whitelisted ignore karakteri yok
- Singlet, kendi karakterini token içine dahil ettikten sonra token toplamayı sonlandıran üçüncü tokenleştirme kategorisidir
-
falias
- falias, container'a çıkar çıkmaz çalıştırılan sözcüklerin listesidir
- Varsayılan falias olan
f, container'a yığılmak yerine container'ın tepesindeki sözcüğü çalıştırır - Örnekte
f,d'yi çalıştırdığındad, delimiter listesini sözcüğün string değerine dönüştürür - Bundan sonra
l,g,t,dgibi karakterleri adım adım non-delimiter yapıp, boşluk ve satır sonunu delimiter ve ignore olarak ayarlayan bootstrap süreci devam eder
Bootstrap'in oluşturduğu yürütme ortamı
- İlk bootstrap, delimiter ve ignore kurallarını değiştirerek sonunda boşluk ve satır sonunun token delimiter olduğu, token başlangıç aşamasında ise boşluk ve satır sonunun yok sayıldığı bir ortam kurar
- Ardından
1vecrankokunur;f,crank'ı çalıştırarak crank 1 ortamına girer - Bu sürecin özü, tokenleştirme biçiminin çalışma sırasında değiştirilebilmesidir
- delimiter, singlet ve ignore değişiklikleri program yoluyla otomatikleştirilebilir
- Sistem postfix olduğu ve read-ahead içermediği için, bir ifadeyi değerlendirmeden önce bir veya daha fazla tokenı önceden parse etmeye gerek yoktur
- Falias, prefix sözcükler veya temel sözcüklerin otomatik yürütülmesi olmadan da belirli sözcüklerin çalıştırılmasını sağlar
crank ve metacrank
- crank, stack üzerindeki tokenların hangi döngüyle çalıştırılacağını belirleyen bir mekanizmadır
cranksözcüğü bir sayıyı argüman olarak alır ve sonrasında container'a gelen hern'inci sözcükte stack top'u çalıştırır- Bootstrap'in sonundaki
1 crank, tüm tokenların değerlendirildiği bir ortam üretir 5 crankdurumunda sözcükler, beşinci token gelene kadar birikebilir
- Bootstrap'in sonundaki
- Örnek kod,
2crankadlı sözcüğü oluşturmak içinunglue,swap,quote,prepose,defkullanırunglue, bir sözcüğün değerini alır;crankgibi builtin'lerin function pointer'ını da alabilirprepose, Stem'dekicompose'a benzer ancak öne ekleme yapar ve VMACRO içine koyardef,2crank'ı stack'e2koyup ardındancrankbuiltin'ini çağıracak şekilde tanımlar
-
Cognition'ın container ve macro yapısı
- Stem'de sözcükler doğrudan stack'e konabilirken, Cognition'da değerlendirilmemiş sözcükler container içinde tutulur
- Bu tasarım sayesinde
composebenzeri sözcükler, tek sözcüklü container ile diğer container türlerini tutarlı bir API ile ele alabilir - Cognition'ın macro yapısı, Stem quote'undan farklıdır
- Bir macro değerlendirildiğinde crank yok sayılır ve içindeki tüm öğeler çalıştırılır
- Bir sözcüğe bağlanmış macro değerlendirildiğinde, macro bütünü crank'ten bağımsız çalışır ve cranker yalnızca bir kez artar
- Macro, crank'ten bağımsız kodlar ve optimizasyon amaçlı expansion için kullanışlıdır
-
metacrank
n m metacrank, stack'te üsttennaşağıdaki öğe içinmperiyotlu değerlendirme ayarlarcrank,0 m metacrankile aynıdır- Her token için yalnızca bir metacrank değerlendirmesi yapılabilir ve daha düşük metacrank öncelik kazanır
- metacrank ve crank, yalnızca dosya tokenlarına değil, sözcük tanımlarının özyinelemeli değerlendirilmesine de uygulanır
- metacrank, “
ntoken okuduktan sonra bu tokenı çalıştırmak istiyorum” gibi doğrudan sözdizimi manipülasyonlarını mümkün kılar - Prefix sözcükler programlanıp işleri bitince
undefile kaldırılabilir - Belirli bir bitiş karakteri yerine belirli sayıda token sonra duran prefix karakterler de oluşturulabilir
- Kullanıcı girdisi bir matematik programına verilip, onun çıktısı metacrank benzeri bir sözdizimi sistemine aktarılabilir
Stem lehçesine doğru evrim
- Cognition, bootstrap sonrasında Stem v2'ye yakın bir sözdizimini dilin içinden kademeli olarak kurar
- Önce
f, falias listesinden çıkarılır ve yalnızcaingbırakılırfdoğrudan stack'e konursa çalıştığı için, önceffoluşturulur ve string ikiye bölünerek ikifelde edilir- Sonrasında
f, false karşılığı olan boş bir sözcük olarak tanımlanır
-
#yorumları#karakteri, ilk kez gerçek bir prefix gibi davranan kod örneğidir- Bu yorum karakteri, satır sonuna kadar olan metni atan bir prefix olarak davranır; böylece parser'ın ileriye baktığı bir sözdizimi biçimi oluşturur
- Uygulama,
geti,getd,gets,crankbase,halt,VMACRO cast,singlet,delimgibi öğelerin birleşimiyle kurulur geti,getd,getssırasıyla ignore, delimiter ve singlet değerlerini string olarak alırhalt, tüm metacrank değerlerini 0 yaparVMACRO cast, stack top'taki container'ı macro'ya dönüştürür#tanımı, önce tokenleştirme kurallarını değiştirir; sonra gelecekte tokenleştirilecek sözcük üzerinde#'ı çağırır, yorumudropile atar ve ardından özgün crank ile metacrank durumuna döner
-
escape, quote, macro
\\, normalde değerlendirilecek bir sözcüğü bile stack'e koyabilen bir escape karakteri olarak tanımlanır- Ardından
[quote tanımı eklenir ve sonra bu quote kullanılarak, özyinelemeli quote yapabilen daha iyi bir[tanımıyla kendisini yeniden tanımlar - Postfix
defsayesinde önceki tanım kullanılarak yeni tanım oluşturulabilir - Bu desen, low-level Cognition'da sık kullanılan bir geliştirme yaklaşımıdır
(, macro bracket olarak tanımlanır- Macro'lar otomatik expansion yapacak şekilde tasarlanır; bu nedenle zaten expand edilmiş bir macro'yu bir sözcüğe bağlamanın daha verimli olduğu kabul edilir
- İşlevsel olarak değerlendirme biçimi aynıdır
expand, quote veya macro içindeki sözcük tanımlarınıunglueile özyinelemeli biçimde expand eder- Önce temel
expandtanımlanır, ardından daha genel durumları ele almak içinexpandkendi kendisini kullanarak yeniden tanımlanır
Brainfuck lehçesi
- Cognition, gelişmiş Stem lehçesi üzerinde bir Brainfuck lehçesi tanımlar
- Çalıştırma örneği:
../crank -s 2 bootstrap.cog helloworld.bf brainfuck.cog brainfuck.cog, alışılagelmiş anlamda bir Brainfuck parser değildir- Brainfuck sözcüklerini tanımlar
- Brainfuck'ı tokenleştirir
- Onu Cognition'ın native ortamında çalıştırır
- Bu örnek, alternatif sözdizimlerinin Cognition sözdizimi ile kolayca tanımlanabildiğini gösterir
- Cognition, sembolleri okuyup sembole göre davranış belirlemek yerine, metacrank kullanan prefix karakterlerin kendisini sözcük olarak tanımlayarak sözdizimini sözcük tanımlarının içine yerleştirir
dialect dialect fikri
mkprefixgibi bir sözcük hayal edilebilir- Örneğin
[ve]adlı iki giriş sözcüğüyle bir işlem alıp,[görüldüğünde]gelene kadar o işlemi otomatik uygulayan bir sözcük
- Örneğin
- Böyle bir fikir, hem
metacrankhem dedef'in normal sözcükler olması sayesinde mümkündür d,i,sdahil her şey sözcük olduğundan, sözdizimi uygulamasını otomatikleştiren daha soyut lehçeler kurulabilir- Henüz standart kütüphanede uygulanmamış olsa da, Matthew Hinton ile standart kütüphane olasılıkları arasında şunlar tartışılmıştır
- Soyut sözcükleri otomatik üreten ve çağıran bir metaword
- Mevcut wordlist'i otomatik soyutlayacak bir word-generator araması
- Problem çözmek için soyutlama çerçevesini yönlendiren bir yaklaşım
Sözdizimini kod olarak ele alma imkânı
- Cognition'da string işleme, tokenizer sonrası işleme ile eşdeğer olduğundan string işlemleri güçlü bir anlam taşır
- Olası kullanım alanları arasında Symbolic AI, sözdizimi ve grammar araştırmaları, dil ve metalanguage prototip deneyleri sayılır
- Ayar dosyası okuyan programlar, Cognition tabanlı shell, Cognition tabanlı işletim sistemi gibi fikirler de dile getirilir
- Temel nokta, Cognition'ın “syntax as code” yaklaşımını mümkün kılmasıdır
- Sözdizimi dinamik olarak programlanabilir
- Sözdizimi üretiminin kendisi de otomatikleştirilebilir
- Metastack ve
cdgibi kavramlar ele alınmamıştır; bunlar ilerideki yazılar için bırakılmış konulardır
1 yorum
Hacker News yorumları
Örneğin Racket’ta Datalog sözdizimini kullanırken diğer Racket modülleriyle birlikte çalışabilen gömülü bir Datalog uygulaması oluşturabilirsiniz ve temel veri modeli değişmez
S-ifadelerine hapsolmadan metaprogramlama yapmaya olanak tanırken bunu daha yüksek bir seviyede ele alan bir yaklaşım
Bu tür sözdizimi bootstrapping’i havalı ve araştırma açısından değerli, ama Racket yaklaşımından temelde daha iyi mi bilmiyorum
Lisp, Scheme ve Racket makroları genelde AST üzerinde çalışır, ancak Rhombus, AST’ye benzeyen ama bazı ayrıştırma kararlarını sonraya bırakan “shrubbery” üzerinde çalışarak sözdizimi genişletmeye biraz esneklik sağlar
Referans: https://docs.racket-lang.org/guide/hash-reader.html, https://docs.racket-lang.org/datalog/datalog.html, Rhombus makalesi https://doi.org/10.1145/3580417
#langinin daha kullanışlı olduğunu düşünüyorumYalnızca readtable ile bile bir C derleyicisi uygulayacak kadar güçlü: https://github.com/vsedach/Vacietis
Kişisel olarak “metacrank”ın geçtiği kısımda kahkahayı bastım
Emacs Lisp, Common Lisp ve ISLISP’te makrolar sadece bir veri alır ve bir veri döndürür; AST diye bir kavram yoktur
(foo-macro ...)çağrıldığında...herhangi bir veri olabilirÖrneğin
(defmacro rev (&rest items) (reverse items))makro çağrısının kaynak argüman listesini alıp tersine çevirir(rev 1 2 3 4 +)veya(rev (rev 10 n -) (+ a 20 b) (rev 30 a *) list)gibi kullanılabilir; pratikte iletilenler listeler, sayılar ve sembollerdirNe metindir ne de AST;
evale hesaplanmış veriyi verseniz de aynı şekilde çalışırLisp’in reader’ı temelde veri katmanı olan sembolik ifadeleri okur; EVAL, makrolar ve diğer işlevler de çoğunlukla veri alır
Derleyici içeride bir AST temsili oluşturabilir, ama bu uygulama özgürlüğüdür; Lisp dili genelde metin sözdizimi değil veri sözdizimi üzerinde tanımlanır
Lisp yorumlayıcısı çalışma sırasında metin değil S-ifadeleri işleyen bir “List Processor”dır;
COMPILEda metin değil S-ifadeleri alırRacket ve Scheme’in ayrı makro sistemleri vardır
Gerçek proje olan Cognition’dan bahsedilene kadar 300’den fazla kelime geçiyor; Lisp anlatısı güzel, ama projenin en önemli kısmı mı emin değilim
Bilgilendirici bir yazı okurken sürekli “zamanıma değer mi?” diye tartarım; bu yüzden belgenin ne hakkında olduğunu baştan söylemesi gerekir
“Cognition, kullanıcıların değiştirebildiği sözdizimini araştıran yeni bir dildir” gibi bir şey yeterli olurdu; ilk dört paragraftan sonra bile okumaya devam etmeye değip değmeyeceğini kestirmek zordu
Vakit nakitse, bu yazıyı okumaya harcanan zaman boşa gitmiş sayılabilir
İnternetteki tüm içeriklerin kişisel zevklere göre uyarlanmasını beklemektense, var olan biçimlere uyum sağlamanın daha iyi olduğunu düşünüyorum
Metin, video gibi yalnızca sıralı tüketilmesi gereken bir ortam değildir; çapraz okuyup ilginç kısımları bulur, yoksa kenara atar, varsa başa dönüp okursunuz
Farklı yazım biçimleri, tükettiğiniz bilgiyi bilinçli olarak filtrelemeye zorladığı için daha iyidir; yalnızca pasif tüketim zihni tembelleştirir
Ancak video olsaydı katılırdım
Videoda izlemeden önce zaman yatırıp yatırmayacağınıza karar vermeniz gerekir; 2x hız veya 5–10 saniye atlama biraz yardımcı olur ama sorunu çözmez
Önce sorunu açıklayıp sonra çözümü tanıtan bir yapı
Sadece birkaç cümle okuyunca bile, Lisp’i duymuş ama Emacs yapılandırma dosyası dışında hiç kullanmamış benim gibiler dahil %99,999’un umursamayacağı bir “soruna” Don Kişotvari bir çözüm olduğunu anlamak mümkündü; yine de okumaya devam ettim
Böyle bir bölüm olmasaydı devamındaki içeriği anlamak daha zor olurdu
O arka planı bilmiyorsanız tüm yazının bağlamını kaçırabilirsiniz ve bunun bir korkuluk safsatası olup olmadığını değerlendirmek de zorlaşır
Bu yüzden bütün şey çok dar bir ihtiyaç için varmış gibi hissettiriyor; oysa başlık çok daha genel ve oldukça ilginç bir kavram gibi görünüyor
İlk iki cümle içinde çözmeye çalıştığı sorunun ne olduğu ortaya çıkıyor ve ilgi düzeyimi ölçmek için önerilen girişten çok daha yararlı
Yalnız kişisel olarak, programlama saflığı merdivenine baktığımda Forth, kaldırabileceğim felsefi saflığın sınırı gibi duruyor
İleride daha fazla kara büyü işlemeye devam edeceğiz
Ancak neredeyse tüm diller, tüm Lisp’ler dahil, alıntılama işini yanlış ele alıyor; komik şekilde
m4bunun istisnasıLisp, bu sorunu makrolarla aşar; nesne dili cümleleriyle ifade edilen meta dil cümlelerini, alıntılamayı yok sayarak ele almayı sağlar
Bu sorun, hem nesne dilinde hem de meta dilde boşluğun atomun sonu olarak kabul edilip ikisinin ayırt edilmemesinden kaynaklanır
Cognition’ın tamamen sonekli anti-sözdizim yaklaşımı, concatenative programlama dillerine benziyor; ancak sonekli diller, önekli dillerin ikili karşılığıdır ve aynı sorunu yaşar
Ya tüm sembollerin aritesini önceden belirleyip higher-order fonksiyonlar kullanmamak gerekir ya da ağacı serileştirebilecek bir çift ayırıcıya ihtiyaç vardır
Örtük 0’ıncı dereceden bir yığına bel bağlamak, depresyonu tedavi etmek için lobotomi yapmaya benzer
Ne ölçüde yeni bir şey yaptığımızı biz de bilmiyoruz; Lisp ile bizim yaptığımız işin yapılabileceğini düşünüyorsanız, yanıldığımızı kanıtlamanızdan memnun oluruz
m4te alıntılamanın nasıl farklı olduğuna dair bir örnek merak ediyorumİddianın kendisi ilginç, ama daha somut bir şeye ihtiyaç var
Lobotominin yüksek düzeyli işleme yeteneğini azaltması gibi, komut dizgesi hesaplamasının en ilkel biçimine dönmek de benzer görülebilir
https://www.hpmuseum.org/rpnvers.htm
Özellikle bu düzeneğin çok küçük olması hoşuma gidiyor
Dil uzmanı değilim, yenilik var mı bilmiyorum; ama yazıyı okurken yazarların her tepeyi aştıklarında yeni olasılık sıradağları keşfetmenin sevincini yaşadıkları hissediliyordu
Doğru anladıysam, Cognition ile gerçekten düşünen makineler yapılabileceği söyleniyor
Programın durdurulup yeni bir komutla yeniden başlatılmasına gerek kalmadan, yeni girdilere dayanarak kendi kendine yeni alt rutinler yazıp çalıştırabilir
Yani program yeni soyutlamalar oluşturup yeni API’lere bağlanarak öğrenebilir ve uyum sağlayabilir
Bana göre bu, daha büyük sinir ağlarından veya yeni öğrenme tekniklerinden daha ilginç
Common Lisp’te reader macro var; bununla sözdizimini istediğiniz gibi değiştirebilirsiniz ve reader macro ile Fortran sözdizimini okuyan Fortran derleyicileri de var
Common Lisp’te okuma zamanındaki reader macro’lar, makrolar ve derleme zamanındaki compiler macro’lar bulunur; tüm bu makro dilleri de Common Lisp’tir
Metaprogramlamanın makrolar veya sözdizimiyle pek ilgisi yoktur; tipler, arayüzler, sınıflar, metotlar gibi semantik unsurları ve anlamı manipüle etme yeteneğini ifade eder
CL’nin kendisi yeterince güçlü değilse bunun için CLOS, yani Common Lisp Metaobject Protocol vardır
CL reader macro ile başka bir tokenizer kullanabilirsiniz, ama tokenizer geçişini read table içindeki bir ifadeyle bildirmeniz gerekir
Cognition’da ise bir fonksiyon çağrıldığında çağıranın bağlamındaki tokenizer değişiyormuş gibi görünüyor
Turing makinesi veya lambda hesabı gibi şeylerle bu tür işlerin önemli olduğunu öğrenmemizin nedeni, yüksek seviyeli dilin temel dille eşdeğer olduğunu göstermek ve böylece birincisi hakkında yürütülen akıl yürütmenin ikincisine de uygulanabileceğini göstermektir
Aklıma gelen ilk ve tek örnek durma problemi
Pratik ölçekte, temel dilde bellek sızıntısı olmadığını kanıtlarsak türetilmiş dilde de sızıntı olmadığını söyleyebilir miyiz?
Bu tür bootstrap etmenin ne gibi avantajları olduğunu merak ediyorum
Yanıt sadece Everest’e tırmanmak gibi “çünkü orada” ise, buna da saygı duyarım
dfsonrasındaki boşluk, 3. satırdaki boşluk ve satır sonunun önemli olduğu kısımda doğrudan “teşekkürler, almayayım” noktasına geldimÖnceki satırın sonundaki üç boşluk karakteri iğnelemeyi gösterir; sonda kalan boşlukların kolayca ayırt edilemediği yerlerde düz anlamıyla yorumlanabilir
Bahsettiğiniz bootstrap kısmı aslında okura boşlukları ve satır sonlarını ayırıcı olarak ele almasını söyleyen bölüm
Yani ayırıcı olarak ilan edilen bölgede boşluğun anlam taşıdığından şikâyet etmiş oluyorsunuz
Elbette böyle düşünmeye hakkınız var, ama bunu daha iyi yapmanın bir yolu var mıydı, merak ettiriyor
En az bir kez literal boşluğun bu şekilde anlam taşımaması hâlinde bunu yapmanın bir yolunu düşünemiyorum
Sözdizimi olmadan “cümle bunu olmadan sen sözdizimi okuyabilir misin” gibi bir cümleyi okuyabileceğinizi mi düşünüyorsunuz?
Cognition’ın tamamen sonekli anti-sözdizim kullandığı söyleniyor, ama sonekli ifade de sözdizimidir
Almanca konuşan birine cümle sonunda gelen fiiller hakkında sorun yeter
İlk örnekte bile operandların ve operatörlerin sırası önemlidir; işte bu sözdizimidir
Bu, saçma derecede sıkıştırılmış bir dil yapma girişimi gibi görünüyor ve bana APL’yi çok hatırlatıyor
Yazarlara ipucu: Sözdizimini ortadan kaldırmadınız; sadece insanların okumasını ve anlamasını zorlaştırdınız, okunabilirlik ve anlaşılabilirlik programlamada önemli unsurlardır
Ayağımın altındaki kurallar sürekli değişiyormuş gibi geldi; kurallar ve kelimeler tanıtılıyor, sonra kafalarına göre yeniden tanımlanıyormuş gibi
Genel olarak Numberwang havası var, bunun hiciv gibi algılanmasının nedenlerinden biri de bu gibi görünüyor
Bir diğer büyük neden de bootstrap aşamasının gülünç derecede yazılmış olması; bu da kasıtlı gibi
Kesinlikle derin bir şeyler var, ama daha sert bir kahve içtikten sonra tekrar okumam gerekecek
Bu yazının yazarlarından biriyim; sorun şu ki aktarılması gereken gerçekten çok şey var
Matthew ile bu dil tasarımı üzerine 3 hafta boyunca her gün saatlerce yazıştık ve beni gerçekten tanımayan insanların zihninde doldurulması gereken çok fazla bağlam var