2. Lisp Hakkında
Lisp, Fortran'dan sonra ikinci en eski yüksek düzeyli
programlama dilidir ve ilk günlerinden çoğu özelliği
değişmişir.
Günümüzde en çok bilinen genel amaçlı Lisp lehçeleri
Common Lisp ve Scheme'dir.
Lisp, 1958'de Massachusetts Institute of Technology'de
(MIT) John McCarthy tarafından icat edilmiştir.
3. Neden Lisp?
• Çünkü yapay zeka programlama için vazgeçilmezdir
• Çoğu dilde olmayan yeni yapıları bünyesinde
barındırır
• Fonksiyonel programlamayı destekler.
• Nesne tabanlı programlamayı destekler.
• Lambda calculus yazılımı destekler.
4. Ön Şartlar
• Bu eğitimde ön şart olarak bir bilgisayar programı ve
programlama dili nedir sorusunun cevabını biliyor
olarak kabul edilmektesiniz.
5. Common Lisp’in Özellikleri
• Makine-bağımsızdır
• İteratif tasarım yapılabilir ayrıca kolayca genişlitilebilir.
• Programların dinamik olarak güncellenmesine izin verir.
• Gelişmiş nesne yönelimli programlama sağlar.
• Geniş kontrol yapıları sağlar.
• Nesneler, yapılar, listeler, vektörler, ayarlanabilir diziler,
karma tablolar ve simgeler gibi geniş kapsamlı veri türleri
sağlar.
7. LISP – Kurulum için gerekenler
• Text Editorü(Windows Notepad,vi,Brief,Emacs)
*Uzantılarımız .lisp olmalıdır
• Lisp yorumlayıcı(executer)
• CLISP
8. CLISP
• Lisp executer(çalıştırıcıdır).
• Windows versiyonunu aşağıdaki linkten indirip
kurabilirsiniz.
http://sourceforge.net/projects/clisp/files/latest/download
9. CLISP NASIL KULLANILIR?
• Yukarıdaki işlemi tamamlayıp clisp’i kurduktan sonra
clisp kendini PATH variable olarak işletim sistemine
ekleyecektir.
• Dosyalarımız *.lisp yada *.lsp dosya uzantısında
olmalı
• Örnek: clisp hello.lisp
10. LISP PROGRAM YAPISI
• Lisp ifadeleri sembolik ifadeler yada s-ifadeler olarak
bilinir.
• S-ifadeleri üç geçerli nesneden oluşur bunlar;
• Atoms(Atomlar)
• Lists(Listeler)
• Strings(Karakter Katarı)
• Herhangi bir s ifadesi geçerli program olarak kabul edilir
• Lisp programları compiler(derleyici) yada
yorumlayıcı(interpreter) ile yürütülür
11. LISP PROGRAM YAPISI 2
• Lisp yorumlayıcısı kayak kodu kontrol eder ve kodu
döngü içine alarak kodu okur,işler ve yazdırır.
• Read(Oku),Eval(İşle),Print(Yazdır) LOOP (REPL)
• Basit Bir Program Örneği [Yorumlayıcı için]:
• (+7 9 11) Çıktı -> 27
• Aynı çıktıyı compiler ile elde etmek için:
• (write( +7 9 11))
(write (+ 7 9 11))
12. Lisp Programlarının
Değerlendirilmesi
• İki aşamadan oluşur.
• 1.)Bir çevirici yardımı ile text editörde yazılmış lisp
kodları lisp nesnelerine dönüştürülür
• 2.)Kodların dildeki anlamı(semantiği) değerlendirici
program tarafından gerçekleştirilir.
13. Değerlendirici Program Nasıl Çalışır?
• Değerlendirici kod’da bulunan stringleri lisp nesnelerine
yada s-ifadelerine dönüştürür.
• Değerlendirici s-ifadelerinin lisp formatında syntax(söz
biçimini) tanımlar bu ikinci aşamada hangi s-ifadelerinin
lisp formunda olduğunu belirler
• Değerlendirici bir fonksiyon gibi çalışarak parametre
olarak geçerli lisp formu alır ve bir değer döndürür.
• Ayrıca bu ifadelerimizi neden parantezler içinde
yazdığımızında cevabıdır bu sayede tüm ifadeyi/formu
değerlendirici programa bir parametre olarak veriyoruz.
14. LISP PREFIX
• Lisp programlama dili prefix notation kullanır.Bir
önceki slaytta gördüğümüz örnekteki gibi operatörler
operandlarından önce yazılır.
• Örnek : ifadesini olarak
yazmalıyız.
a * ( b + c ) / d (/ (* a (+ b c) ) d)
15. Klasik Hello World Programı
• (write-line "Hello World")
• (write-line "Lisp Ögreniyorum")
16. Temel Syntax(Sözdizimi)
Lisp’in Temel Yapıtaşları
•1.)Atom:Atom veri tipi içinde
alfanümerik(sayı,harf,özel karakter) bulundurabilir.
• Örnek:name,12346789,*hello*,-wpram734-
•2.)List:List veri tipi içinde sıralı olarak atom veya
başka listeler bulundurur.
• Örnek:(i am a list), ,
•3.)String:String veri tipi çift tırnak arasında bulunan
karakter gruplarını içinde barındırır.
• Örnek:"i am a string"
(a ( a b c) d e fgh) ( )
17. Lisp’te Yorum Satırı
• Lisp’te yorum satırı oluşturmak için « ; » noktalı
virgülü kullanırız.Örneğimize bakalım.
Yorum Satırı Örneği
• (write-line "Hello World") ; greet the world;
• ;tell them your whereabouts
• (write-line "I am at 'Tutorials Point'! Learning LISP")
18. Mutlaka Bilmeniz Gerekenler!
• Lispte’ki basit sayısal operatörler = * , - , * ve /
• Fonksiyon çağırma biçimi f(x) yerine -> (f x) : Örnek(cos 45)
• Lisp’te büyük küçük harf ayrımı yoktur cos 45 = COS 45 ‘tir.
• LISP, bir fonksiyonun argümanları da dahil olmak üzere her şeyi
değerlendirmeye çalışır. Sadece üç tür sabittir ve her zaman kendi
değerlerini verirler.Bunlar;
• Numbers (Sayılar)
• « t » harfi mantıksal true(doğru) ifade eder
• « nil » mantıksal false(yanlış) veya listeler için empty(boş) ifade eder.
19. Lisp - Veri Tipleri
• Lisp’te değişkenlerin tipi yoktur fakat veri nesnelerinin tipi
vardır.
• Veri tiplerini ayıracak olursak;
• Scalar Tipler:Sayılar,Karakterler,Semboller,v.b
• Veri Yapıları:Listeler,Vektörler,Stringler
« typep » ifadesi, bir nesnenin belirli bir türe
ait olup olmadığını bulmada kullanılır.
« type-of » ifadesi, belirli bir nesnenin veri
türünü döndürür.
20. Lisp Veri Tipleri -2
Bu tanımlı türlerin dışında, kendi veri türlerinizi oluşturabilirsiniz. Veri
yapısı «defstruct» ifadesi kullanılarak tanımlanır.
21. Veri Tipleri Örnekleri
• Örnek 1
Executing the program....
$clisp
main.lisp 10
34.567
123.78
NIL
110000.0
62
23. Lisp - Değişkenler
• LISP'de, her değişken bir sembol ile temsil edilir.
• Değişkenin ismi sembolün adıdır ve sembolün
gösterdiği hafıza hücresinde saklanır.
• Global Değişkenler
• Global değişkenler program boyunca hafıza’da kalır.
• Genel değişkenler genellikle «defvar» ifadesi ile tanımlanır.
• Örnek:(defvar x 234) (write x) -> 234
24. Lisp – Değişkenler 2
• LISP'deki değişkenler için tür bildirimi olmadığından,
« setq » ifadesi ile bir sembol için doğrudan bir değer
belirtirsiniz
• Ayrıca « let » ve « prog » ifadelerini kullanarakta
değişken tanımlayabiliriz.
Örnek
(setq x 10) 10
(write x)
25. Lisp – Sabitler
• LISP'de sabitler, program yürütülürken değerleri asla
değişmeyen değişkenlerdir.
• Sabitler « defconstant » ifadesi kullanılarak tanımlanır
Executing the program....
$clisp main.lisp
Radius: 10.0
Area: 314.1592
27. Lisp – Karar Yapıları
• LISP'deki karar yapıları;
• Cond : Bu yapı, birden fazla test-action cümleciklerini kontrol etmek
için kullanılır. Diğer programlama dillerinde iç içe geçmiş if ifadelerine
benzerdir.
• If:Koşul sağlanırsa if bloğu işletilir sağlanmaz ise devam edilir.
• When:Koşul ifadesi doğru ise işlem yapılır, aksi takdirde programa
devam edilir.
• Case:Bu yapı, cond yapısı gibi birden fazla koşul doğru ise işle şeklinde
çalışır. Bununla birlikte, anahtarları(keys)değerlendirir ve çoklu seçim
ifadesini oluşturur.Switch-case ‘ yapısına benzer
28. Lisp – Karar Yapıları
Örnekleri
• Cond Syntax:
• If Syntax:
(cond (test1 action1) (test2 action2) ... (testn actionn))
Executing the program....
$clisp main.lisp
value of a is 10
(if (test-clause) (action1
) (action2
))
Executing the program....
$clisp main.lisp
value of a is 10
29. Lisp – Karar Yapıları
Örnekleri
• When Syntax:
• Case Syntax:
(when (test-clause) (<action1
) )
Executing the program....
$clisp main.lisp
a is greater than 20 value of a is 100
(case (keyform) ((key1) (action1
action2
...) ) ((key2) (action1
action2
...) ) ... ((keyn) (action1
action2
...) ))
Executing the program....
$clisp main.lisp
Thursday
30. Lisp – Döngüler
• «Loop» ifadesi: Lisp’de bilinen en basit döngü ifadesidir koşul
sağlandığı sürece işlenir
• «Loop for» ifadesi:Diğer programlama dillerindeki for loop’una
çok benzer.
• «do» ifadesi:Diğer programlama dillerindeki do while’a benzer
• «dotimes» ifadesi:Dotimes yapısı, ifadeyi sabit sayıda
çalıştırmayı sağlar.
• «dolist» ifadesi:Listenin üzerindeki her elemana iteratif olarak
erişmeyi sağlar.For each yapısına benzer.
31. Lisp – Döngü Örnekleri
• «Loop» Syntax:
• «Loop for» Syntax:
(loop (s-expressions))
12
13
14
15
16
17
18
(loop for loop-variable in <a list>
do (action)
)
(loop for loop-variable from value1 to
value2
do (action)
)
TOM DICK HARRY
32. Lisp – Döngü Örnekleri 2
• «do» Syntax:
• «do list Syntax» (dolist (n '(1 2 3 4 5 6 7 8 9)) )
• «do times örnek»
(dotimes (n 11)
(print n) (prin1 (* n n)))
(do ((variable1
value1
updated-value1
) (variable2
value2
updated-value2
)
(variable3
value3
updated-value3
) ...) (test return-value) (s-expressions) )
x = 0 y = 20
x = 2 y = 18
x = 4 y = 16
x = 6 y = 14
x = 8 y = 12
0 0
1 1
2 4
3 9
4 16
5 25
6 36
7 49
8 64
9 81
10 100
33. Lisp – Fonksiyonlar
• «Fonksiyon» Syntax:
• Notlar:
• Parametre olarak boş bir liste gönderebilirsiniz; bu, fonksiyonun
argüman almadığı anlamına gelir, boş liste « ( ) » olarak yazılır.
• Ayrıca return-from ifadesini kullanarak işlevden fonksiyondan geriye
değer döndürebilirsiniz.
(defun fonksiyonadı (parametreler) . Fonksiyon
gövdesi)
25
34. Lisp – Tahminler
• Tahminler, bazı özel koşullar için argümanlarını test eden ve
koşul doğru ise non nil(nil olmayan) değer, koşul yanlış ise nil
değerini döndüren fonksiyonlardır.
• Atom:Bir bağımsız değişken alır ve bağımsız değişken bir atom ise t
(true) döndürür, aksi takdirde nil(0,false) döndürür.
• Equal:İki bağımsız değişkeni alır ve eğer değerler birbirine eşitse
t(true) değilse nil (false) döndürür.
• Eq:İki bağımsız değişkeni alır bunlar denk nesnelerse, aynı bellek
konumunu gösteriyorlarsa t(true) aksi durumda nil(sıfır) döndürür
35. Lisp – Tahminler 2
• Evenp:Bir sayısal değişken alır ve argüman çift ise t(true), aksi takdirde
0 döndürür.
• Oddp:Bir sayısal değişken alır ve argüman tek ise t(true), aksi takdirde 0
döndürür.
• Zerop:Bir sayısal değişken alır ve değişken sıfır ise t(true) döndürür aksi
takdirde 0 döndürür.
• Null:Bir argüman alır ve argüman nil ise t(true) döndürür, aksi takdirde
nil(0) döndürür.
• Listp:Bir argüman alır ve argüman liste ise t(true) döndürür, aksi
takdirde nil(0) döndürür.
36. Lisp – Tahminler 3
• Greaterp:Bir veya daha fazla parametre alır ve tek bir bağımsız
değişken varsa veya birden fazla değişken varsa ve bu parametreler
soldan sağa doğru artarak gidiyorsa (3 4 5) gibi t(true) döndürür aksi
takdirde nil(0) döndürür.
• Lessp:Bir veya daha fazla parametre alır ve tek bir bağımsız değişken
varsa veya birden fazla değişken varsa ve bu parametreler soldan sağa
doğru azalarak gidiyorsa (5 4 3) gibi t(true) döndürür aksi takdirde
nil(0) döndürür.
• Numberp:Bir parametre alır eğer parametre sayı(number) ise t(true)
döndürür aksi takdirde nil(0) döndürür.
• Symbolp:Bir parametre alır eğer parametre sembol(symbol) ise t(true)
döndürür aksi takdirde nil(0) döndürür.
• İntegerp: Parametre integer ise t(true) değilse nil(0) döndürür.
37. Lisp – Tahminler 4
• rationalp:Bir parametre alır eğer parametre rasyonel sayı ise t(true)
değilse nil(0) döndürür.
• floatp:Bir parametre alır eğer parametre float ise t(true) değilse nil(0)
döndürür.
• Complexp:Bir parametre alır eğer parametre karmaşık sayı ise t(true)
değilse nil(0) döndürür.
• Characterp:Bir parametre alır eğer parametre karakter ise t(true)
değilse nil(0) döndürür
• Stringp:Bir parametre alır eğer parametre string ise t(true) değilse
nil(0) döndürür.
• Arrayp:Bir parametre alır eğer parametre array ise t(true) değilse nil(0)
döndürür.
40. Lisp – Karakterler(Chars)
• # işareti:Lisp’de karakterlerimizin önüne «#» işaretini getirmeliyiz
• Örnek:(write-char #a) Çıktı -> a
• Özel Karakterler:Özel karakterleri nasıl yazdıracağımızın cevabı ise çok basit örneğin
space (boşluk) yazdırmak için # SPACE yazmalıyız
Diğer özel karakterlere bakarsak ne demek istediğimiz daha iyi anlaşılacaktır.
#Backspace
#Tab
#Linefeed
#Page
41. Lisp – Karakterler Üzerindeki
Karşılaştırma Fonksiyonları
•Lisp’de ‘ < ‘, ‘ > ‘ gibi büyüktür küçüktür gibi sayı operandları üzerinde
işlem yapar, bu operatörler karakterler üzerinde çalışmaz kısacası ‘<‘ ,
‘>’ operatörleri karakterler için aşırı yüklenmiş operatörler değillerdir.
•Lisp’de bazı karakter üzerindeki karşılaştırma fonksiyonları büyük küçük
harf duyarlı(case-sensetive) bazıları ise büyük küçük harf duyarsız(case-
insensetive)’dir.Bir sonraki slaytımızda bu fonksiyonlara bakacağız.
42. Lisp – Karakterler Üzerindeki
Karşılaştırma Fonksiyonları 2
Büyük Küçük Harf
Duyarlı Fonksiyonlar
Büyük Küçük Harf
Duyarsız
Fonksiyonlar
İşlevi
char= char-equal Operandlar birbirine tamamen
eşit ise true döndürür aksi
durumda nil döndürür.
char/= char-not-equal Operandlar birbirine eşit
değilse true aksi durumda nil
döndürür
char<= char-not-greaterp Soldaki herhangi bir operand
kendinden sonraki operand
değerinden büyük veya eşit ise
true aksi takdir nil döndürür
char>=
char-not-lessp Soldaki herhangi bir operand
kendinden sonraki operand
değerinden küçük veya eşit ise
true aksi takdir nil döndürür