2 puan yazan GN⁺ 2024-05-13 | 1 yorum | WhatsApp'ta paylaş

McCarthy'nin "Lisp in Lisp"ini Python ile hayata geçirmek

  • 1960'ların başında John McCarthy tarafından geliştirilen Lisp, homoikoniklik özelliğine sahip olduğu için kod ile veri birbirinin yerine geçebilir

    • Lisp'te kod ile veri arasındaki sınır belirsizleşir
    • Bu sayede Lisp, kendisini doğal biçimde ifade edebilir
  • Lisp 1.5 kılavuzunun 13. sayfasının alt kısmındaki yarım sayfalık kod, Lisp'in kendisiydi

    • Alan Kay bunu "yazılımın Maxwell denklemleri" olarak adlandırmıştı
    • Programlamanın tüm dünyası yalnızca birkaç satır koda sıkıştırılmış durumda
  • Bunu anlamak için Python kullanarak "Lisp in Lisp" kodunu yeniden hayata geçirmek iyi bir yöntem

    • Çoğu programcı Lisp sözdizimine aşina olmayabilir ama Python sözdizimine aşina olacaktır
    • Amaç, Lisp kodunun ruhunu olabildiğince koruyarak onu Python ile yeniden yazmak

Lisp'in M-expression ve S-expression'ları

  • Lisp başlangıçta iki sözdizimi flavor'ına sahipti

    • M-expression (meta ifade): kod flavor'ı
    • S-expression (sembolik ifade): veri flavor'ı
    • İkisi anlamsal olarak aynıdır
  • "Lisp in Lisp" kodu M-expression ile yazılmıştır ve S-expression Lisp'i uygular

  • Lisp M-expression'larını Python kod yapısına dönüştürmek, S-expression'ları ise Python listeleriyle ifade etmek bir yöntemdir

    • Lisp, "List Processing" ifadesinin kısaltmasıdır ve yalnızca liste adlı tek bir veri yapısını kullanır

1. uygulama

  • Python liste temel fonksiyonlarıyla Lisp'in temel işlemleri uygulanır

    • atom(x): x'in liste olup olmadığını kontrol eder
    • eq(x,y): x ile y'nin aynı olup olmadığını kontrol eder
    • car(x): listenin ilk öğesini döndürür
    • cdr(x): listenin geri kalan kısmını döndürür
    • cons(x,y): atomu listeye ekler
    • append(x,y): iki listeyi birleştirir
  • Bazı özyinelemeli temel öğeler göz ardı edilerek, Llama3-70b'nin yardımıyla "Lisp in Lisp" kod alt kümesi için bir yorumlayıcı hızlıca hayata geçirilebilir

2. uygulama

  • İlk uygulamada lambda özelliği eksiktir

    • Lambda, Lisp'te fonksiyon tanımlamanın ve çağırmanın başlıca yoludur
    • Lambda olmadan özyineleme kurulamaz, özyineleme olmadan da Turing tamamlığı sağlanamaz
  • Lambda'yı uygulamak için assoc(x,y) ve pairlis(x,y) temel öğeleri gerekir

    • assoc(x,y), ilişki listesi kullanan bir key/value sözlük aramasıdır
    • pairlis(x,y), Python'daki zip(x,y) ile aynıdır
  • Lisp'te loop olmadığı için basit bir doğrusal arama için bile özyineleme kullanmak gerekiyordu

    • Ancak Python'da bunu liste üreteçleriyle zarif biçimde dönüştürmek mümkün
    • evcon ve evlis de benzer şekilde loop'a dönüştürülebilir
  • eval fonksiyonu aslında Lisp'te iki argüman alır

    • İlki ifade (s-exp), ikincisi ise key/value listesi olan ortamdır (environment)
    • Ortam, LAMBDA'nın değişken bağlamalarını korur
    • Dinamik kapsam (dynamic scoping) tekniği kullanılır

GN⁺ görüşü

  • Lisp'in homoikoniklik özelliğini Python'da taklit etmeye yönelik ilginç bir deneme. Ancak Lisp'e özgü nitelikleri kusursuz biçimde taşımakta sınırlar olduğu görülüyor. Lisp'in cazibesini deneyimlemek için en iyi yol yine Lisp'in kendisini öğrenmek gibi görünüyor.

  • Lambda fonksiyonları ve dinamik kapsam gibi Lisp'in güçlü özelliklerinin Python'da hayata geçirilmiş olması etkileyici. Ancak bunu gerçek projelere uygulamak için eksik kalan birçok nokta var gibi görünüyor. Eğitim veya araştırma amacıyla değerli olabilir.

  • Bu tür denemelerin kendisi, programlama dillerinin özü üzerine derinlemesine düşünmek için bir fırsat olabilir. Dilin sözdizimi ve uygulamasının ötesine geçip programlama paradigmaları açısından bakış geliştirmeyi sağlayabilir.

  • Lisp ailesi dillerini öğrenmek, fonksiyonel programlama ve meta programlama konusunda içgörü kazanmayı sağlayabilir. Scheme, Clojure, Racket gibi modern Lisp ailesi dillerine bakmak da iyi olabilir.

1 yorum

 
kayws426 2024-05-13

Python içine gömülü bir Lisp lehçesi
https://hylang.org/