Scheme, işlevsel programlama tarzını kolaylaştırmak ve basit, temiz bir sözdizimini teşvik etmek amacıyla tasarlanmış, Lisp programlama dilinin minimalist bir lehçesidir. Parantez kullanımı, güçlü bir makro sistemi ve özyineleme ile birinci sınıf prosedürlere güçlü bir vurgu ile karakterizedir. Dil, işlevsel programlama paradigmasını teşvik eder ve işlevsel, imperatif ve mantıksal programlama dahil olmak üzere çeşitli programlama tekniklerini destekler.
Scheme, 1970'lerde Gerald Jay Sussman ve Guy L. Steele Jr. tarafından Massachusetts Teknoloji Enstitüsü'nde (MIT) yaratılmıştır. Zamanla karmaşık hale gelen orijinal Lisp dilini basitleştirmek ve geliştirmek amacıyla geliştirilmiştir. Scheme'in arkasındaki motivasyon, karmaşık fikirleri ifade etmek için yeterince güçlü, ancak uygulanması ve öğretilmesi daha kolay bir dil yaratmaktı.
Yıllar içinde, Scheme çeşitli revizyonlar ve standartlaşma çabaları geçirmiştir. Bu standartların en dikkat çekeni, dilin ve özelliklerinin resmileştirildiği RnRS (Revisedn Reports on the Algorithmic Language Scheme) standartlarıdır. Scheme topluluğu, dilin gelişimine devam etmiş ve R6RS ve R7RS gibi yeni standartlar ortaya çıkarmıştır; bu standartlar yeni özellikler ve iyileştirmeler getirmiştir.
Günümüzde, Scheme, özellikle bilgisayar bilimi eğitiminde, zarafeti ve temiz sözdizimi nedeniyle akademik ortamlarda popülerliğini korumaktadır. Modern programlama dilleri ve paradigmaları üzerinde etkisi görülmektedir. Scheme, genellikle işlevsel programlama topluluğu ile ilişkilendirilir ve Clojure ve Racket gibi dillerin ilham kaynağı olmuştur; bu diller, Scheme'in ilkelerini temel alarak yeteneklerini genişletmiştir.
Scheme, kodun ön ek notasyonunda yazıldığı tamamen parantezli bir sözdizimi kullanır; örneğin, bir toplama işlemi (+ 1 2)
şeklinde yazılır.
Scheme'deki fonksiyonlar birinci sınıf vatandaşlardır; bu, onların argüman olarak geçirilebileceği veya diğer fonksiyonlardan döndürülebileceği anlamına gelir. Örnek:
(define (make-adder x)
(lambda (y) (+ x y)))
(define add5 (make-adder 5))
(add5 10) ; 15 döner
Scheme, kuyruk çağrısı optimizasyonunu destekler; bu, fonksiyonların kuyruk pozisyonunda gerçekleşen özyinelemeli çağrılar için mevcut yığın çerçevesini yeniden kullanmasına olanak tanır ve yığın taşmasını önler.
Scheme, devamların kullanılmasına izin verir; bu, programcıların hesaplama durumunu yakalayıp kontrol akışını manipüle etmelerini sağlar:
(call-with-current-continuation
(lambda (exit)
(exit 'done)))
Scheme, programcıların sözdizimsel uzantılar oluşturmasına olanak tanıyan güçlü bir makro sistemine sahiptir. Basit bir makro şu şekilde tanımlanabilir:
(define-syntax my-if
(syntax-rules ()
((_ test then else)
(if test then else))))
Scheme, listeler, çiftler ve yüksek dereceli fonksiyonlar gibi yapılar aracılığıyla veri soyutlamasını destekler ve verilerin verimli bir şekilde işlenmesini sağlar.
Scheme, bir değişkenin kapsamının kaynak kodundaki fiziksel konumuna göre belirlendiği sözdizimsel kapsam kullanır. Bu, değişken bağlamaları ile ilgili öngörülebilir bir davranışa yol açar.
Scheme dinamik olarak tiplenmiştir; bu, değişkenlerin açık tip bildirimlerine ihtiyaç duymadan herhangi bir türde değerler tutmasına olanak tanır.
Bir Lisp lehçesi olarak, Scheme liste işleme için optimize edilmiştir; bu, listeler üzerinde işlemler yapmayı kolaylaştırır:
(define my-list (list 1 2 3 4))
(car my-list) ; 1 döner
(cdr my-list) ; (2 3 4) döner
Scheme fonksiyonları, bellek kullanımını ve performansı optimize etmek için kuyruk pozisyonunda özyinelemeli olarak tanımlanabilir. Örneğin:
(define (factorial n)
(define (fact-helper n acc)
(if (zero? n)
acc
(fact-helper (- n 1) (* n acc))))
(fact-helper n 1))
Scheme uygulamaları genellikle seçilen uygulamanın çalışma zamanı ortamı kullanılarak oluşturulabilir. Örneğin, Racket'te, .rkt
dosyalarını çalıştırmak veya bunları çalıştırılabilir dosyalara derlemek için racket
komut satırı aracını kullanabilirsiniz.
Scheme için mevcut olan çeşitli derleyiciler ve yorumlayıcılar şunlardır:
Scheme, programlama ilkelerini öğretmek ve bilgisayar bilimi araştırmalarında bir araç olarak akademide yaygın olarak kullanılmaktadır. Yapay zeka, dil tasarımı ve betikleme gibi alanlarda uygulamaları vardır ve sembolik hesaplama veya karmaşık veri manipülasyonu gerektiren çeşitli alanlarda kullanılmaktadır.
Her iki dil de işlevsel programlama tarzını destekler, ancak Python okunabilirlik ve sadeliğe vurgu yaparken, Scheme güçlü ve özlü ifadelere odaklanır. Scheme'in parantez ağırlıklı sözdizimi, başlangıç seviyesindeki kullanıcılar için bir engel olarak görülebilirken, Python'un girintili sözdizimi genellikle daha erişilebilir kabul edilir.
JavaScript de işlevsel programlamayı destekler ve birinci sınıf fonksiyonlara sahiptir. Ancak, JavaScript prototip tabanlı bir nesne sistemine sahipken, Scheme işlevsel paradigmalar üzerine kuruludur. Scheme'in makro sistemi, JavaScript'te bulunmayan yetenekler sunar.
C, sistem programlama için tasarlanmış düşük seviyeli, statik tipli bir dildir; oysa Scheme yüksek seviyeli ve dinamik tiplidir. C, performansa ve donanım düzeyinde manipülasyona odaklanırken, Scheme soyutlama ve hesaplamanın teorik yönlerine vurgu yapar.
Her iki dil de işlevsel programlamaya dayanmaktadır. Haskell daha katı bir tip sistemine sahiptir ve tembel değerlendirmeyi desteklerken, Scheme'in dinamik tiplenmesi ve hevesli değerlendirmesi daha esnek programlamaya olanak tanır, ancak bu bazı performans kayıplarına yol açabilir.
Ruby, işlevsel programlama özelliklerini karıştıran bir nesne yönelimli programlama dilidir; oysa Scheme tamamen işlevseldir. Ruby'nin sözdizimi daha ayrıntılıdır, oysa Scheme'in sadeliği minimalist tasarımından gelmektedir.
Scheme kodunun diğer dillere çevrilmesi, hem Scheme sözdizimini hem de hedef dili anlayan araçlarla kolaylaştırılabilir. Bazı yararlı kaynak koddan kaynak koda çeviri araçları şunlardır:
Chicken Scheme, Scheme kodunu C'ye çevirebilen bir derleyici sağlar; bu, C kütüphanelerinden yararlanmayı ve verimli çalıştırılabilir dosyalar oluşturmayı mümkün kılar.
Scheme'in bir türevi olan Racket, kodu JavaScript'e dönüştürme ve derleme yeteneklerine sahiptir; bu, web uygulamalarını dağıtmayı kolaylaştırır.
Gambit Scheme, Scheme kodunu C'ye ve yerel çalıştırılabilir dosyalara derleyebilir; bu, performans açısından kritik uygulamalar için verimli çeviri seçenekleri sunar.