Lisp, "LISt İşleme"nin kısaltmasıdır ve semboller ile listelerin manipülasyonu etrafında dönen, kendine özgü parantez tabanlı bir sözdizimi paylaşan bir programlama dilleri ailesidir. 1950'lerin sonlarında icat edilen en eski yüksek seviyeli programlama dillerinden biridir ve on yıllar boyunca önemli ölçüde evrim geçirmiştir. Lisp, dinamik tipleme, bellek yönetimi ve birinci sınıf fonksiyonlar gibi güçlü özellikleri ile özellikle yapay zeka araştırmaları, sembolik hesaplama ve hızlı prototipleme için uygun hale gelmiştir.
Lisp, 1958 yılında John McCarthy tarafından bilgisayar programları için matematiksel bir notasyon ve yapay zekayı uygulamak için pratik bir araç olarak yaratılmıştır. Dil, matematiksel mantık ve bilgisayar bilimlerinde bir formal sistem olan lambda hesaplamasından türetilmiştir. İlk uygulama IBM 704 üzerinde gerçekleştirilmiş ve kısa süre sonra her biri kendi özelliklerini ve karmaşıklıklarını ekleyen birçok lehçe ortaya çıkmıştır.
Zamanla, Common Lisp ve Scheme gibi birkaç dikkat çekici Lisp lehçesi ortaya çıkmıştır. Common Lisp, çeşitli lehçeleri birleştirmek için 1980'lerde standartlaştırılmıştır, oysa işlevsel programlama ve minimalizmi vurgulayan Scheme, akademide popülerlik kazanmıştır. Lisp'in etkileri, özellikle işlevsel programlama paradigmalarını destekleyen modern programlama dillerinde, Clojure, Racket ve hatta Python ve Ruby gibi dillerde görülebilir.
Bugün, Lisp en popüler programlama dilleri arasında yer almamakla birlikte, özellikle araştırma, yapay zeka ve eğitim alanlarında etkili olmaya devam etmektedir. Topluluk, Java Sanal Makinesi (JVM) üzerinde çalışan ve eşzamanlı programlamaya odaklanan Clojure gibi daha yeni lehçeleri aktif olarak geliştirmektedir.
Lisp, ifadeleri belirtmek için parantezler kullanan benzersiz bir sözdizimi kullanır ve kod, sembolik ifadeler (S-ifade) olarak temsil edilir. Örneğin:
(+ 1 2)
Bu ifade, 1 ve 2'nin toplamını temsil eder.
Lisp'teki fonksiyonlar, argüman olarak geçirilebilir, diğer fonksiyonlardan döndürülebilir ve değişkenlere atanabilir:
(defun square (x) (* x x))
(mapcar #'square '(1 2 3 4)) ; (1 4 9 16) döner
Lisp dinamik olarak tiplenmiştir, bu da değişkenlerin önceden bildirim olmaksızın herhangi bir veri türünde değerler tutmasına olanak tanır:
(setq x 10) ; x artık bir sayı
(setq x "merhaba") ; x artık bir dize
Lisp, geliştiricilerin özel sözdizimsel yapılar oluşturmasına olanak tanıyan güçlü makro sistemlerine sahiptir:
(defmacro when (condition &body body)
`(if ,condition
(progn ,@body))
)
if
ve cond
formları, Lisp'te kontrol akışını kolaylaştırır:
(if (> x 0)
(print "Pozitif")
(print "Pozitif değil"))
Lisp, listeleri temel veri yapıları olarak ele alır:
(setq my-list '(1 2 3 4))
(car my-list) ; 1 döner
(cdr my-list) ; (2 3 4) döner
Fonksiyonlar defun
yapısı kullanılarak tanımlanır:
(defun factorial (n)
(if (= n 0)
1
(* n (factorial (- n 1)))))
Common Lisp, Common Lisp Nesne Sistemi (CLOS) olarak bilinen bir nesne yönelimli sistemi içerir:
(defclass person ()
((name :initarg :name :accessor person-name)
(age :initarg :age :accessor person-age)))
(defmethod say-hello ((p person))
(format t "Merhaba, benim adım ~A ve ben ~A yaşındayım."
(person-name p) (person-age p)))
Lisp, handler-case
kullanarak karmaşık bir hata yönetim mekanizması sunar:
(handler-case
(/ 1 0)
(division-by-zero () (print "Sıfıra bölme hatası yakalandı!")))
Bazı lehçelerde devamlar desteklenir, bu da programın yürütme durumlarını kaydetmesine ve geri yüklemesine olanak tanır:
(call-with-current-continuation
(lambda (k)
(k 10)))
Lisp programlamasına yönelik birkaç Entegre Geliştirme Ortamı (IDE) ve derleyici bulunmaktadır. Popüler seçenekler arasında:
Bir Lisp projesini derlemek için genellikle ".lisp" veya ".lsp" uzantılı bir dosya oluşturursunuz. SBCL kullanarak tipik bir iş akışı, projenizi REPL'den yüklemeyi içerebilir:
(load "my-project.lisp")
Quicklisp kullanan projelerde, bir kütüphane yöneticisi olarak bağımlılıklar kolayca yönetilebilir ve yüklenebilir.
Lisp, yapay zeka, sembolik hesaplama ve akademideki uygulamaları ile özellikle tanınmaktadır, ancak aynı zamanda aşağıdaki alanlarda da kullanılmaktadır:
Lisp genellikle aşağıdaki dillerle karşılaştırılır:
Lisp'ten diğer dillere çeviri genellikle kaynak koddan kaynak koda çeviri araçları kullanılarak yapılır. Örneğin, aşağıdaki araçlar mevcuttur:
Bu araçların her biri, Lisp'in temel işlevselliklerinin hedef dillerde etkili bir şekilde temsil edilmesini sağlamak için belirli eşlemeler sunar. Daha karmaşık çeviriler için, özellikle yoğun makro optimizasyonu yapılmış kodlar için manuel yeniden yapılandırma gerekebilir.