LİSP NEDİR?

 Lisp,

kullanımda olan en eski ve en güçlü programlama dillerinden biridir. List Processing 'in (Liste işleme) kısaltılmış ifadesidir temelde interpreted dil olarak geliştirilmiştir.

 Lisp

LİSP NEDİR?

Lisp'in geçmişi diğer programlama dillerininkinden farklıdır (özellikle Algol ve C ailelerininkinden). Bu yüzden Lisp topluluğu, değişik seviyelerde, farklı kavramlar ve adlandırmalar geliştirmiştir. Örneğin "car", bir listenin ilk öğesini almak için, "cdr" de kalan öğeleri (gerisini) almak için kullanılır. Listeler "cons" yardımıyla oluşturulabilir, "mapcar" liste üzerinde ilerlemek için kullanılır

LİSP NEDİR?

Lisp'in veri yapısı olarak sadece listeler sunduğu düşünülür. Bu düşünce çok eski Lisp lehçelerinin düşünülmesinden ve Lisp'in "List Processing”in (Liste İşleme) kısaltması olmasından kaynaklanıyor. Aslında Common Lisp, diğer dillerde yararlı bulduğunuz her şeyi sunuyor; struct'lar (C benzeri struct'lar), diziler, hakiki çok boyutlu diziler, nesneler (Smalltalk and Java'daki gibi alanlar ve metotlarla), karakter katarları... vb.

ÖZELLİKLERİ
 

Lisp dinamiktir. Esneklik sağlar. Lisp içebakış özelliğine sahiptir (introspective). Fonksiyonların, paketlerin, sınıfların, metotların dinamik olarak eklenmesi, yeniden tanımlanması, çıkarılması desteğine ek olarak programların kendi çalışma ortamlarına dair çalışma esnasında bilgi alması (fonksiyonlar, paketler, sınıflar, vs. tanımlı mı), bu nesneleri veri olarak manipüle etmesi, bunları kaydetmesi, dönüştürmesi, vs. de mümkündür.

ÖZELLİKLERİ

Ayrıca Lisp derleyicisi dilin standart bir parçasıdır ve çalışma esnasında programlar tarafından kendi kendilerini değiştirmek için çağrılabilir. Yeni programlar anında yaratılabilir ve akabinde derlenip, yüklenip çalıştırılabilir ve tüm bunlar o anda çalışmakta olan programın çalıştığı ortam içinde, onun dışına çıkmadan yapılabilir (dosya G/Ç işlemi bile yapmaya gerek kalmadan). Bu da otomatik programlamayı ve katmanlı dillerin geliştirilmesini destekler.

ÖZELLİKLERİ
 

Lisp'in söz dizimi kolayca yeniden biçimlendirilebilir. makro teknolojisi ile de bir programı başka bir programa çok etkin şekilde çevirmek mümkündür. program çalışması ve hata ayıklaması esnasında verinin nasıl gösterileceğini de kontrol etmemize izin verir. bir programcının özelleştirmeleri diğer programcıyı kötü olarak etkilemeyecek şekilde gerçekleştirilebilir.

ÖZELLİKLERİ
 Lisp,

programcıları bir programı çalışır hale getirmek için değişken tipi tanımlamaya zorlamaz. Lisp'in birincil odak noktası programın çalışır hale gelmesidir. Sonrada tip tanımlamalarını ekleyebiliriz ve böylece derleyici optimizasyonlarından faydalanabiliriz

ÖZELLİKLERİ

Lisp'in güçlü bir sınıf sistemi vardır ve bununla da yetinilmeyip çok esnek bir meta-sınıf sistemi geliştirilmiştir. Sınıf sistemi çok güçlü ve esnek şekilde "slot" ve metot tanımlamaya, metot birleştirmeye ve başka pek çok şeye destek verir. Meta-sınıf sistemi ise programcıların nesne sistemini programlanabilir veri olarak kullanabilmelerini ve böylece yeni tür sınıfları dinamik olarak yaratmalarını sağlar.

ÖZELLİKLERİ

Lisp, hata bildirimi ve hata ele alma için güçlü araçlar sunar. Bu da demektir ki bir problem çıktığında programları durdurmak ya da "coredump" oluşturmaktan başka seçenekler de vardır. Nesneye yönelik hata ele alma garip hata durumlarını temsil etmeyi, hata durumunda olası seçenekleri değerlendirmeyi ve uygun seçeneği gerçekleştirmeyi kolaylaştırır.

ÖZELLİKLERİ
 Lisp

otomatik hafıza yönetimi kullanır. Bu da bir programcının bir nesne ile işi bittiğinde artık onunla ilgilenmeyeceği ve çöp toplayıcının(garbage collector) o nesneye ayrılmış hafızayı tekrar sisteme geri kazandıracağı anlamına gelir.

ÖZELLİKLERİ
 En

az sınırlayıcı syntax’a sahip olması en önemli avantajlarındandır. Bu sayede program yapmaksızın öğrenilecek form sayısı en aza indirgenir. kullanıcı ara yüzü (GUI) programlamada kolaylık sağlar.

 Grafik

DİĞER DİLLERDEN AYIRAN ÖZELLİKLER
  

LISP bugün yaygın kullanımda olan ikinci en yaşlı yüksek düzey programlama dilidir. bir dilden ziyade diller ailesi niteliğini taşımaktadır. Yapay zekâ üzerine birinci araştırma dili olarak adapte edilmiş ve daha sonraki birçok değişik dil gelişmesine rağmen yapay zekâ uygulamalarında en üstün dil olma özelliğini korumuştur. Listeler (Listeler olarak kastedilen cümlenin kelimeleri,kelimeleri oluşturan harfler,kişilerin adı vs ) üzerinde işlemler yapmak için önerilmiş bir dildir.

DİĞER DİLLERDEN AYIRAN ÖZELLİKLER
  

LISP basit bir söz dizimine sahip olup, ağaç şeklindeki yapıların işlenmesinde kolaylık sağlamaktadır. Yüksek seviyeli programlama dilleri arasında en az sınırlayıcı syntax’a sahip diller içinde yer alır. LISP temelde interpreted dil olarak geliştirilmiş olup alt sistem geliştirme C,PASCAL gibi compiled dillere oranla daha kolay yapılmaktadır. LISP’te programlar veri gibi ele alınabilmektedir. Yani yapılan tüm programlar diğer programlara yada alt prosedürlere giriş olarak kullanılabilmektedir. C ve PASCAL C ve PASCAL dillerinde data özel yollarla gösterilmekte ve programcı karşılaştırılabilir formlar yapmak için oldukça zaman ve çaba harcamaktadır.

DİĞER DİLLERDEN AYIRAN ÖZELLİKLER

  

LISP’te mevcut makrolar dilde güçlü bir şekilde genişletme yapabilmeyi sağlar. C,C++’ta run time anında yapılması gereken bir çok şeyi compiler anında yapmaya izin verir. Düşük seviyeli dillerde rast gele sınırlama olmaksızın yapması zor olan düzenli çoklu değerlerle işlem için, basit düzenli bir yol sağlamaktadır. Geliştirilmiş hata tutma sistemine sahiptir. Tüm dile ulaşımları sınırlar, check eder. Böylece gizli çarpışmalar(crash) alma önlenmiş olur. LISP’te tüm veriler dinamik tiptedir.

DİĞER DİLLERDEN AYIRAN ÖZELLİKLER

Garbage-collection daha emniyetli, daha kesin ve doğru hafıza yöntemi sağlar. Ayrıca çok daha hızlıdır ve modüller arasında daha az bağımlılık sağlamaktadır. Garbage-collection’ın olmayışı programcıları C’de ad-had, informally-specified, genellikle bugridden kullanmayı gerektirir ve hafızayı sürmek için çoğunlukla yavaş teknikleri sürer. LISP’te mevcut atomlar seçimlere bir isim vermeye izin verir. Böylelikle yavaş string karşılaştırmaları yerine bazı şeyleri sadece atom olarak gözaltına alıp değerleri karşılaştırmalarda kullanılabilmekte ve işlem hızlandırılmaktadır. Kod fragmanlarını fonksiyonlara argüman olarak dahil etmeye izin vermektedir. Böylelikle daha basit şekilde GUI programlayı sağlar.

LİSPİN YAPISI
VERİ TİPLERİ:
LISP ile programlamada kullanılabilecek veri tipleri aşağıda çıkartılmıştır.
– – – – – –

Tamsayılar Reel sayılar kayan noktalı(floating point) Rational sayılar(tam kesir de denir örnek (/ 5 3 )=5/3 tür. 1.666667 değildir. Yazı dizileri (strings) Listeler

LİSPİN YAPISI
Değişkenler:  Lisp diğer diller gibi değişkenlere sahiptir. Fakat bunlar tanımlanmak (declare) edilmek zorunda değildir. Sadece bir ifadeye değer vererek o ifadenin değişken olmasını sağlıyorsunuz.(setq fonksiyonu ile değer veriyoruz.).

LİSPİN YAPISI
 String

işlemleri (setq b1 "bbb") iki stringe değer atanır (setq b2 "bbb") (string-equal b1 b2) iki stringin eşit olup olmadığına bakılır.

Global değişkenler tanımlarken defparameter veya defvar anahtar kelimelerini kullanırız. > (defparameter *global* 100) >(defvar *global* 100) Artık program içerisinde herhangi bir yerde *global* değişkenini kullandığımız zaman bize hata vermeyecektir. >(setq *global* 30)  global=30 olmaktadır. Bir global değişkenin değerini değiştirebilmemiz için setq anahtar kelimesini kullanırız. Yerel değişkenler tanımlanırken let makrosu ile tanımlanır >( let ( ( a 20 ) ( b 30 ) )(+ a b)) Aşağıdaki örnekte x değişkeni yerel değişken olarak tanımlanmış ve 2 değeri atanmıştır. >( let ((x 2))(+ x 3) )  5 Aşağıdaki örnekte ise f ‘e +operatör değeri veriliyor. >(let ((f +))(f 2 3))  5

LİSPİN YAPISI

String:
String dizileri tırnak içinde yazılması gereken karakter dizileridir. Bu metin girişlerinde herhangi uzunluk sınırlaması yoktur. “okul” “firat üniversitesi” “futbol” örnek olarak verilebilir.

Rasgele sayı üretimi:
Rast gele sayı üretmek için random fonksiyonu kullanılır. Üst sınır verilir ve 0 - üst sınır arası bir sayı gönderir. Örnek: (random 5 ) üst sınır 5 tir burada ve 0--- 5 arsı bir değer gönderir. Mesela 3

ATOMLAR
Lisp te 2 özel atom vardır. Bunlar t ve Nil dir. t “true “ olarak telaffuz edilip doğruyu temsil etmektedir. Nil ise yanlış veya boş listeyi temsil etmektedir.

LİSTELER
 Değişkenlerden

oluşan gruplardır. Ve parantezler içerisinde ( ) içinde yazılırlar değişik amaçlar için kullanılabilirler.  ( listp '( pontiac cadillac chevrolet ) ) liste oluşturma fonksiyonudur .

LİSTEYE EKLEME
 (cons

'a '( b c d ) ) ile de listenin içerisini yeni eleman girilebilir.  Burada a karakterini liste içerisine dahil edilmesi gösterilmiştir. Listenin başına ekleyerek yeni bir liste oluşturur.  (cons (car '(a b c)) (cdr '(a b c))) (a b c)

LİSTEDEN SİLME
(

setq data '( 5 8 3 10 6 ) ) setq ile değer atanan listeden bir elemanı silmek için  Kullanacağımız komut (remove 10 data) dediğimiz zaman liste içerisinden gidip 10 elemanını bulup listeden siliyor.  Bu silme işlemini yaptıktan sonra komut ekranına liste ismimizi yazdıgmız zaman değişikliğin gerçekleşmemiş olduğu görülür.

LİSTEDEN SİLME
 Kısacası

yukarıda anlatılan: 1) (setq data '(5 8 3 10 6 )) listeyi atadık 2) (remove 10 data) ile listeden 10 sildik 3) data liste ismini yazarsak sonuç (5 8 3 10 6) yazar 4) (setq data (remove 1000 data)) ile listeden silersek sildiğimiz anda değişiklik yansıtılır 5) şimdi data dersek ( 5 8 3 6) yazar

LİSTE SIRALAMA
 (setq

data '(1 3 5 7 2 4 6 ) ) oluşturulan bir listeyi sıralamak istersek 1)(setq data ( sort data # '< )) ile küçükten büyüge sıralar (1 2 3 4 5 6 7) 2) (setq data ( sort data # '> )) ile büyükten küçüge sıralar (7 6 5 4 3 2 1)

Listede birleştirme,kesişim alma ve farklarını alma:
1) birleşme iki farklı listeyi birleştirmek (union '(1 2 3 5 7 8 ) '(2 3 4 6)) Sonuç: (8 7 5 1 2 3 4 6) 2) İki farklı listede ortak olan elemanları ekrana verir (intersection '(1 2 3) '(2 3 4)) Sonuç: (3 2) 3) iki farklı listede ortak olmayan elemanları ekrana verir. (set-difference '(1 2 3 4) '(2 3)) Sonuç: (4 1)

LİSTEDE ELEMAN ARATMA:
 (member

‘5 ‘(3 5 7 8 9 7 )) dediğimiz zaman 5 ten büyük olanları ekrana yazar. Sonuç olarak bize ( 5 7 8 9 7 ) verecektir.

LİSTENİN YIĞIT (STACK ) GİBİ KULLANILMASI:

Eğer listenizi bir değişkende depolarsanız. Onun stack gibi davranmasını sağlarsınız. Örnek: > ( setq a nil ) boş bir liste oluşturup onu da a değişkeninde depo ediliyor. NIL > (push 23 a) (23) > (push 55 a) (55 23 ) > (pop a) Örnek: (setf sporlar ‘( futbol tenis basketbol) sporcu ‘( 11 1 5 )) Örnek: (list 'a 'b (+ 2 2)) (A B 4) Listeye dönecektir. Örnek: () sadece bu şekilde belirtirsek boş bir liste oluşturur ve bize değer olarak NIL gönderir.

LİSPTE DÖNGÜLER

Common lispte tam loop yapıları vardır. Bu döngü yapıları dolist, loop, dotimes ‘dir. (dolist (num ‘(2 5 9 4 1 6 )) (print num ) burada listedeki her bir elemanı num değişkenine atar ve ekrana yazar. Diğer kullanışlı döngü ise dotimes (dotimes ( i 10 ) (print i) ) 1 2 3 … 9 kadar ekrana yazar. (defun factorial (n) loop for i from 1 to n for fac = 1 then (* fac i) loop kullanımını göstermektedir finally (return fac)))

LİSP İLE YAPI TANIMLAMA
>

(defstruct foo bar baaz quux)FOO Burada tipi foo olan üç tane alan oluşturuldu. Bu yapı dört durum ile kullanılabilir.  make-foo: foo tipinde yeni bir nesne oluşturur.  foo-bar, foo-baaz, foo-quux: foo tipinde olan bir nesnenin bu alanlara erişmesini sağlar.

LİSP İLE YAPI TANIMLAMA
> (make-foo) #s(FOO :BAR NIL :BAAZ NIL :QUUX NIL) > (make-foo :baaz 3) #s(FOO :BAR NIL :BAAZ 3 :QUUX NIL) > (foo-bar *) NIL > (foo-baaz **)3

Burada foo adında bir nesne tanımlanarak önce değerlere 0 atanıyor daha sonra baaz değeri 3 olarak değiştiriliyor

SETQ

Setq: Basit bir setq kullanımına örnek olarak değişkenlere değer atama verilebilir. Örneğin aşağıdaki kodda a,b ve c değerlerine 1,2 ve 3 değerleri atanıyor. >(setq a 1 b 2 c 3) a => 1 b => 2 c => 3 setq nun diğer bir kullanımı da sıralı değerleri kullanarak güncelleştirmeler yapmaktır. Örneğin aşağıdaki kodda önceden tanımlanmış değerler ile yeni değerler oluşturulurken setq komutu kullanılmış. >( setq a ( + 1 b ) b ( + 1 a ) c ( + a b ) ) a => 3 b => 4 c => 7

SETF

Setf: setf komutu liste tanımlamasında kullanılır. Yukarıda tanımladığımız yapı üzerinde düşünürsek a değeri ilk başta 0 iken aşağıdaki setf komut ile bu değeri 3 yapıyoruz. > (setf a 3)

LİSPTE SYNTAX YAPISI

Lispin sözdizimi her şeyi parantezler arasına almanız gerektiğini söyler Örnek: (1 67 98 ;1 67 98 birer liste elemanı (7 34) ;(7 34) listesi de ayrı bir eleman (“MERHABA”) ;bu string başka bir eleman ÇAYDANLIK (32 4 (2 0 (AD SOYAD)))) ;yukarıda bir liste tanımlanmıştır (setq a ‘naber) ;a değişkenine bir string değeri ata

LİSPTE SYNTAX YAPISI
 Lisp’in

bu garip syntaxı size neredeyse sınırsız bir yazım kolaylığı sağlar, çünkü bundan başka uymanız gereken bir kural yok gibidir. Yine bu sayede lisp program içindeki kodları da data gibi ele alabilmektedir.  Lisp derleyicisine girilen her metin listeler halinde düzenlenmeli, bunlar da listelerin listesi olarak ya da gereğince düzenlenir.

LİSPTE SYNTAX YAPISI

Lisp in sentaks yapısı aşağıdaki şekilde özetlenebilir: x ; x sembolü () ; boş liste (1 2 3) ; üç rakamlı liste ("foo" "bar") ; iki string li liste (x y z) ; üç sembollü liste (x 1 "foo") ; bir sembollü liste, bir rakam ve bir string (+ (* 2 3) 4) ; bir sembollü liste, liste ve bir rakam

LİSPTE SYNTAX YAPISI
(defun fibonacci (n) (loop for a = 1 then (+ a b) and b = 0 then a ; paralel olarak ilerliyor repeat n collect b)) Örneği fibonacci elemanlarını gösterir.

LİSPTE SYNTAX YAPISI
 Bir

diğer şekilde >>(dotimes(i 10) print(i) )  1..9,NİL sayıları gösterir

LİSPTE SYNTAX YAPISI

. Döngü özelliklerini görmek üzere aynı şekilde >>dotimes(i ‘D) print(i) ) Kodu denendiğinde ise ancak hata olarak D nin bir tamsayı(integer) olmadığı alındığı görülmüştür. ‘D yi D şeklinde yazmamız programın onu değerlendirilecek bir nesne olarak algılamasına neden olur ‘D diyerek sabit tanımlaması yapılmıştır.

LİSPTE SYNTAX YAPISI

Bir başka kullanım şeklini gösterecek olursak; >>(setf gunler ‘(mon tue wdn thr fri str sun)) <MON TUE WDN THR FRI STR SUN> >>(setf loop-count 0) 0 >>(loop (when( endp gunler) (return loop-count ) ) (setf gunler ( rest gunler ) ) (setf loop-count(+ loop-count 1))) 7

KONTROL İFADELERİ

Koşullar, az çok, Java benzeri dillerdeki istisnalar gibidir. Fakat koşullar daha etkilidir çünkü koşul işleyiciler, örneğin, Lisp çalıştırma sistemini koşulun ortaya çıktığı yerden çalıştırmaya devam etmesi için yönlendirebilirler. (typep c 'condition) => true Şeklinde basit bir tanımlama yapılabilir. if deyimi ile birlikte aritmetiksel ve mantıksal şartlar sorgulanabilir.

LISPTE FONKSİYON TANIMLAMA
 Lisp

programlama dilinde fonksiyon tanımlamak için “defun” sözcüğü kullanılır. <fonksiyon_adı> <parametre_listesi> <fonksiyonun_gövdesi>)

 (defun

LISPTE FONKSİYON TANIMLAMA
 >(defun

kare (x) (* x x) )KARE >(kare 2)4 >(kare 1.4142158)2.0000063289696399  Fonksiyon çağrımları ise; (fonksiyon_adı argument*) şeklinde yapılmaktadır  (+ 1 2) burada + fonksiyonu çağrılmış ve 1 2 sayıları parametre olarak bu fonksiyona gitmiştir. Sonuç 3 olarak size verecektir

LISPTE FONKSİYON TANIMLAMA

 

(defun topla(x y) herhangi iki sayıyı toplar ve bir mesaj olarak sunar. (format t "topla ~d and ~d.~%" x y)(+ x y)) Topla fonksiyonu tanımlayıp onu daha sonra çağırabiliyoruz. Örneğin yukarda topla fonksiyonu tanımladım ve bu fonksiyonu çağırabilmek için (topla 5 4) dediğiniz anda cıktı olarak size topla 5 and 4. 9 verecektir.

LİSTELERLE İLGİLİ BUİLT-IN FONKSİYONLAR
1) (first '(a b c)) A (second '(a b c)) B (nth 2 '(a b c)) B 2) (rest '(a b c)) ile ilk karakter hariç diğerlerini listede tutar 3) ( length '(gm ford chrysler Volkswagen ) ) ( length ‘( a b c d )) length ile yukarıda görülen listelerin uzunluğu bulunuyor.

4) (subseq '(a b c d e f ) 1 5) ile bir liste içerisinden başlangıç ve bitiş parametreleri verilerek liste içerisinden seçer. Burada (a b c d e f ) listesinden başlangıç parametresi (1) bitiş parametresi de (5 )verilmiş. Bunu sonucunda (b c d e f) verecektir.

Fonksiyonun kullanım amacına göre parametre listesi sadece sembollerden oluşabilir. Yalnız bu listedeki semboller sabit olamaz.

Parametre listesindeki semboller mutlaka fonksiyon gövdesinde kullanılıyor olmalıdır. Aksi takdirde derleyici hata mesajı verecektir. Mesela kare fonksiyonumuzu (kare) şeklinde çağıralım; >(kare)Error: KARE got 0 args, wanted 1 arg. Şeklinde bir hata veriyor. lisp derleyicisi, yazdığımız parametrelerden veya fonksiyonumuzun adından önce otomatik olarak setf ve setq komutlarını kontrol eder. Lisp fonksiyonunun gövdesinde, lisp in kendi komutları veya kullanıcı tarafından tanımlanmış uzun komut listeleri olabilir.

5) Car fonksiyonu listenin ilk elemanını alır ve onun değerini bize return eder. (car ‘(a b c )) verilirse bize return edeceği değer A olacaktır. (car '((a b) (c d)))  (a b) 6) Cdr fonksiyonu listenin ilk elemanından sonra geriye kalan liseyi return eder. (cdr ‘(mark sally kathy ))-------- (sally kathy ) verecektir. (cdr '((a b) (c d)))  ((c d)) (car (cdr '(a b c)))  b (cdr (cdr '(a b c)))  (c) (cdr '(a))  ()

7) reverse fonksiyonu ile bir listeyi ters çevirebiliriz. (reverse ‘(a b c d )) (d c b a) verecektir. 8) position fonksiyonu ile listede bir elemanın pozisyonunu bulabiliriz. (position ‘mark ‘(sally kathy mark Charlie)) -- 2 verecektir. 9) sort fonksiyonu ile liste içerisinde sıralama yapabiliriz. (sort ‘(5 1 8 2) ‘<) ----(1 2 5 8 ) sonucunu verecektir.

10) Nth ile bir listenin n. Elemanını istiyorsak o elemana ulaşabiliriz. (nth0 ‘( a b c d e f ))  sonuç a olur ( nth4 ‘( a b c d e f ))  sonuç e olur. 11) apply fonksiyonu bir fonksiyon ismini ve bir listeyi parametresiymiş gibi alır ve fonksiyonu listeye uygular. Örnek: (apply ‘+ ‘( 4 5 6 7 8 )) + fonksiyonunu listeye uygular toplamlarını verir.

12) mapcar fonksiyonunu kullanarak listenin her bir elemanı için oluşturulan fonksiyona gönderilir. Aşağıda iki örnek verelim: Örnek 1: (7 8 3 0 1 4 5) listesinin her bir elemanına 1 sayısını eklemektedir. (defun ekle(num)(+ num 1)) (mapcar #’ ekle ‘(7 8 3 0 1 4 5)) Sonuç olarak size (8 9 4 1 2 5 6) verecektir. Örnek2: Listedeki elemanları 2 katını almaktadır (defun twice (num) (* num 2)) (mapcar #'twice '(1 2 3 4)) Sonuç (2 4 6 8) verecektir.

Mapcar fonksiyonu ile tablo üzerinde çalışmalar (setf words ’((one un)(two deux)(three trois) (four quatre)(five cinq))) Oluşmuş bir listeden mapcar fonksiyonu ile ilk isimleri veya ikinci isimlerini yazdırabiliriz. 1) (mapcar #’first words) first ile ilk isimlerini alırız (ONE TWO THREE FOUR FIVE) 2) (mapcar #’second words) (UN DEUX TROIS QUATRE CINQ) 3) (mapcar #’reverse words) ((UN ONE)(DEUX TWO)(TROIS THREE) … Şeklinde yerlerini değiştirebiliriz.

MAKROLAR

Makrolar, bağımsız değişken olarak kod kabul eden ve karşılığında yeni kod üreten fonksiyonlar olarak anlaşılabilirler Bir makro nun bir uygulaması derleme zamanında bulunduğunda, ilgili form makro ya geçirilir ve sonuç bu formun yerine geçer. Derleme daha sonra yeni formla devam eder. Bu işleme "makro açılımı" denir. Makro ların avantajı dilde güçlü bir şekilde genişletme yapmaya izin vermesidir.

MAKROLAR
 

C ve C++’da run-time anında yapmak zorunda olduğumuz birçok şeyi burada compile anında yapılabilir. "cure" u, car ile aynı olacak şekilde tanımlayan bir makro tanımlayalım: (defmacro cure (argument) (list 'car argument)) Artık gördüğümüz her (cure a), derleme zamanında (car a)'ya dönüştürülür

READ-EVAL-PRİNT MODLARI

  

Lisp program yürütmelerinin ana modu interaktiftir. Prompt işareti alırsınız ve yerine getirilecek bir şeyler type edersiniz. Lisp çalıştırır ve bir sonuç üretir ardından bu sonucu ekrana yazar. Başka bir prompt alarak döngüyü tekrar başlatırsınız. Buna read-eval-print modları denir. Read – Lisp: Kullanıcıya bir ifade verir, kullanıcı bir ifade girer ve lisp bunu okur. Eval – Lisp: Bu ifadeyi değerlendirir ve sonuç üretir. Print – Lisp: Onun cevabını ekrana yazar.

LAMBDA FONKSİYONU

İlk kez 1930 lu yıllarda lambda matematiğinde açıklanan bu yöntem bir fonksiyonu isim vermeden oluşturmadır. Diyelim ki bir sözlükte tüm kelimelere bakarak testi hecelemek istediğimiz bir hikayemiz var ( bağıl sistem öğrencilerin stresini artırıyordu ) cümlesi mevcut, sözlüğümüz de (sınav vize okul kantin çay popkek.. ) sözlükte her kelimeye mapcar fonksiyonuyla erişimle yapılabilir ancak mapcar i bu durumda kullanmak hata veren kodlar yazmamıza neden olacaktır. Bunun için öncelikle kendi fonksiyonumuzu tanımlarız daha sonra mapcar i sorunsuz kullanırız.

LAMBDA FONKSİYONU
 (defun

lookup (word) (member word directory ) ; directory global bir değişken ) bu tanımdan sonra (mapcar #’(lambda(word) (member word directory))story)

ATOM FONKSİYONU

Atom fonksiyonu girilen nesne atom tipindeyse true değer döndüren aksi durumda false döndüren fonksiyondur. Atom olması bir sayı veya isim ifade ettiğini gösterir. (atom 'sss) => true (atom (cons 1 2)) => false (atom nil) => true (atom '()) => true (atom 3) => true

LİSPTE G\Ç İŞLEMLERİ
 Lisp

dili gerçek zamanlı I/O işlemi gerçekleştirebilir. Yani program çalışırken (run-time anında) klavyeden bilgi girişine izin verir. Klavyeden veri almak için “read” fonksiyonu kullanılır.  (SETQ _XYZ_ (READ))

LİSPTE G\Ç İŞLEMLERİ
 Çıkış

için “print” ve “princ” fonksiyonları kullanılır. Princ kullanıldığında imleç bir alt satıra geçmez. Bu geçişi sağlayabilmek için (yani newline işlemi için) “(terpri)” (terminal print) fonksiyonu kullanılır. Print fonksiyonu kullanıldığında ise bu geçiş kendiliğinden olur.

LİSPTE G\Ç İŞLEMLERİ
 Örnek:

(PRINT _XYZ_) (PRINC _XYZ_) (PRINT _XYZ_) == (PRINC _XYZ_ (TERPRI))

GELİŞMİŞ I/O

Karakter string leri ile çalışmak istersek klavyeden satır satır okuma işlemi de yapabiliriz. Bunun için de “(readline)” fonksiyonu kullanılır. Örnek: (SETQ _XYZ_ (READ-LİNE)) Burada “_XYZ_” karakteri, string tipinde bir lisp değişkenidir. Kesinlikle bir liste değildir. Böyle bir stringi yazmak içinde “write-line” ya da “write” fonksiyonları kullanılır. (SETQ _XYZ_ (READ-LİNE)) Klavyeden “lisp öğrenmek çok zevkli” yazılmış olsun (WRITE _XYZ_)  “lisp öğrenmek çok zevkli”

GELİŞMİŞ I/O
Bir dosyayı sadece okumak ve dosya değişkenini saklamak için; (SETQ XFILE (OPEN”DENEME”))  Bir dosyayı sadece yazmak ve dosya değişkenini saklamak için; (SETQ XFILE (OPEN ”DENEME” :DIRECTION: OUTPUT)) yazılır.  Dosyayı kapatmak için o dosyanın değişkeni “close” fonksiyonuna verilir. (CLOSE XFILE)  Bu dosyalar resmi Common lisp te “streams” denir.

GELİŞMİŞ I/O

Eğer açmak istediğimiz dosya yoksa Lisp’in bir dosya oluşturmasını isteyebiliriz. (SETQ XFILE (OPEN “DENEME” :IF-DOES-NOTEXIST: CREATE)) Ya da daha iyi bir yöntem olan; (SETQ XFILE (OPEN “DENEME” :DIRECTION: PROBE)) kullanılır. Bu komut dizesinin sonucu NIL ise “DENEME” adında bir dosya yoktur. Aksi takdirde return edilen değer okuma modunda açılmış bir file stream dir.

GELİŞMİŞ I/O

“read-line” ve “write-line” fonksiyonları stream lerle kullanılabilir. Açık olan bir stream den (dosyadan) bir satır okumak için; (SETQ _XYZ_ (READ-LINE XFILE)) (WRITE-LINE “MERHABA DÜNYA” XFILE) kullanılır. Burada “_XYZ_” string olan bir lisp değişkenidir.