3 puan yazan GN⁺ 2024-05-03 | 1 yorum | WhatsApp'ta paylaş
  • 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
  • crank ve metacrank, 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ığında d, delimiter listesini sözcüğün string değerine dönüştürür
    • Bundan sonra l, g, t, d gibi 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 1 ve crank okunur; 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
  • crank sözcüğü bir sayıyı argüman olarak alır ve sonrasında container'a gelen her n'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 crank durumunda sözcükler, beşinci token gelene kadar birikebilir
  • Örnek kod, 2crank adlı sözcüğü oluşturmak için unglue, swap, quote, prepose, def kullanır
    • unglue, bir sözcüğün değerini alır; crank gibi builtin'lerin function pointer'ını da alabilir
    • prepose, Stem'deki compose'a benzer ancak öne ekleme yapar ve VMACRO içine koyar
    • def, 2crank'ı stack'e 2 koyup ardından crank builtin'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 compose benzeri 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 üstten n aşağıdaki öğe için m periyotlu değerlendirme ayarlar
    • crank, 0 m metacrank ile 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, “n token 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 undef ile 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ızca ing bırakılır
    • f doğrudan stack'e konursa çalıştığı için, önce ff oluşturulur ve string ikiye bölünerek iki f elde 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, delim gibi öğelerin birleşimiyle kurulur
    • geti, getd, gets sırasıyla ignore, delimiter ve singlet değerlerini string olarak alır
    • halt, tüm metacrank değerlerini 0 yapar
    • VMACRO 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, yorumu drop ile 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 def sayesinde ö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ı unglue ile özyinelemeli biçimde expand eder
    • Önce temel expand tanımlanır, ardından daha genel durumları ele almak için expand kendi 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

  • mkprefix gibi 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
  • Böyle bir fikir, hem metacrank hem de def'in normal sözcükler olması sayesinde mümkündür
  • d, i, s dahil 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 cd gibi kavramlar ele alınmamıştır; bunlar ilerideki yazılar için bırakılmış konulardır

1 yorum

 
GN⁺ 2024-05-03
Hacker News yorumları
  • Bu yaklaşımın Racket’ın reader katmanı ayarından daha iyi olduğuna henüz ikna olmadım
    Ö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
    • Common Lisp’in readtable’ından daha iyi olduğundan da emin değilim; CL readtable’a kıyasla Racket’ın #langinin daha kullanışlı olduğunu düşünüyorum
      Yalnızca readtable ile bile bir C derleyicisi uygulayacak kadar güçlü: https://github.com/vsedach/Vacietis
    • Temel örnek olarak Brainfuck kullanıldığını görünce bunu ciddiye almamız mı amaçlanıyor pek emin olamadım
      Kişisel olarak “metacrank”ın geçtiği kısımda kahkahayı bastım
    • Lisp makrolarının AST üzerinde çalıştığı ifadesi Lisp için doğru değil
      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 sembollerdir
      Ne metindir ne de AST; evale hesaplanmış veriyi verseniz de aynı şekilde çalışır
      Lisp’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; COMPILE da metin değil S-ifadeleri alır
      Racket ve Scheme’in ayrı makro sistemleri vardır
  • Yazara tavsiyem, en önemli içeriği başa koyarsa yazının çok daha sağlam hâle gelebileceği
    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
    • Bu dili kullanma ihtimalim düşük; kullansam bile bilgiyi bu yazıdan değil dokümantasyondan alırım
      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
    • Sıralama bana oldukça makul göründü
      Ö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
    • Lisp’le ilgili bölüm projenin en önemli unsuru değil, ama projenin çözmeye çalıştığı sorun türünü gösterdiği kesin
      Böyle bir bölüm olmasaydı devamındaki içeriği anlamak daha zor olurdu
    • Kavram ilgimi çekiyor, ama ilk cümle Lisp’in S-ifadesi sözdizimine bir tepki olarak gerekliliğini gerekçelendiriyor gibi göründüğü için bağlamı kaçırmaktan endişelendim
      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
    • Mevcut yazının tamamen iyi olduğunu düşünüyorum
      İ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ı
  • İlginç bir yazı; umarım yazarlar buradaki alaycılığı umursamayıp kara büyü ritüellerine devam ederler
    Yalnız kişisel olarak, programlama saflığı merdivenine baktığımda Forth, kaldırabileceğim felsefi saflığın sınırı gibi duruyor
    • Bu yazının yazarı olarak, alaycılığı umursamıyorum; hatta oldukça komik bulduğum için memnuniyetle karşılıyorum
      İleride daha fazla kara büyü işlemeye devam edeceğiz
  • Metaprogramlama ile programlama aynı şeydir
    Ancak neredeyse tüm diller, tüm Lisp’ler dahil, alıntılama işini yanlış ele alıyor; komik şekilde m4 bunun 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

  • Geri bildirim için teşekkürler, ama yazının tamamını henüz okumadıysanız okumanız iyi olur
    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
  • Lisp ile 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
  • Örtük yığın benzetmesi gösterişli, ama örtük yığın ilk bilgisayarlar ve hesap makineleri döneminden beri vardı
    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
  • Cognition programının çalışma sırasında sözdizimsel yapıları tanımlayıp yeniden tanımlayabilmesi ve bunların içine girip dışına çıkabilmesi bence gerçekten güzel
    Ö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ç
  • Öncül doğru değil
    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
    • Burada kastedilen şey CL’nin reader macro’su
      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
  • Minimal bir makineyi yüksek seviyeli bir dilin yorumlayıcısına bootstrap etmenin pratik bir örneği 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
  • df sonrası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
    • Bu deneyin ana fikri, Forth’ta yeniden tanımlanamayan tek bir karakter, yani boşluk var; bu kısıt kaldırılırsa ne olur, gibi görünüyor
      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
    • O boşluk karakterleri, daha önce diğer karakterlerden farkı olmayan boşluğu gerçekten boşluk denen şey hâline getirmenin yolu
      En az bir kez literal boşluğun bu şekilde anlam taşımaması hâlinde bunu yapmanın bir yolunu düşünemiyorum
  • “Bir tür sözdizimine sahip olma tuzağı” deniyor ama sözdizimi yapı sağlar
    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
  • Okuması biraz zordu
    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
    • Açıklanacak çok şey var ve şu anki anlatım biçiminin en iyi yol olmadığı düşüncesindeyim
      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