Bir önceki Lisp programlama dili ile ilgili yazımda Lisp dilinin temel özelliklerinden ve teorik olarak syntax yapısından bahsetmiştik. Burada ise işi pratiğe dökerek birkaç satır kod yazacağız. Kodlama için herhangi bir Lisp türevi kullanabiliriz. Ben ise örnekleri Racket üzerinden göstereceğim. Racket’ı tercih etmemin sebebi ise DrRacket isminde başarılı bir geliştirme ortamı sunmaları ve internette çok fazla kaynak içeriyor olmasından kaynaklanıyor. Öyleyse geleneği bozmadan “Hello World” ifadesini ekrana yazdırarak derinliklere doğru yolculuğa başlayalım.
“#lang racket” ifadesi Racket’ın standart kütüphanesini kullanacağımızı bildiriyoruz. (Bu ifade aslında sadece Racket’da bulunuyor. Eğer başka bir Lisp türevinde çalışıyorsanız bu ifade kodunuzda yer almayacaktır.) Sonrasında Print fonksiyonu ile “Hello World” metnini ekrana yazdırıyoruz. Gördüğünüz üzere fonksiyon çağırma işlemini parantezler içerisinde yaptık. Ayrıca fonksiyona parametre gönderirken parantezler içerisinde değil fonksiyonun isminden sonra bir boşluk bırakarak gönderdik.
#lang racket
(print "Hello World!")
Aşağıdaki kodda ise 5 ve 2 sayısının çarpma işlemini prefix notasyonunu kullanarak gerçekleştiriyoruz. Ardından dönen sonucu print fonksiyonuna parametre olarak gönderip ekranda çıktıyı elde ediyoruz. Bir önceki yazımda her bir işlem veya komutun parantezler içerisinde yazıldığını ve bunun sonucunda çok fazla iç içe parantez yapısını gözlemleyebileceğimizden bahsetmiştik. Burada 5 ve 2’nin çarpılması ayrı bir işlem, print fonksiyonun çağrılması ayrı bir işlem olduğundan iç içe parantez yapısını görüyoruz.
#lang racket
(print (* 5 2))
Şimdi biraz işlem karmaşası yapalım ve (4*5+12) /2 ifadesini Lisp ile prefix notasyonunu kullanarak sonucu bulalım. İlk olarak işlem önceliği gereği 4 ve 5’i çarpalım. Sonucu 12 ile toplayalım ve son olarak da 2 ye bölelim.
#lang racket
(print (/ (+ (* 4 5) 12) 2))
Bu yazı çin son olarak aşağıdaki kodu inceleyelim.
Kodda, define anahtar kelimesini kullanarak değerleri sırasıyla 6 ve 5 olan a ve b isminde iki değişken tanımlaması yapıyoruz. Her ne kadar define bir fonksiyon olmasa da burada define’ı, değişken ismi ve değerini alan iki parametreli bir fonksiyon olarak düşünebiliriz. Sonrasında if ile a > b karşılaşırmasıını prefix uygulayarak gerçekleştiriyoruz. Eğer koşul sağlanırsa karşılaştırma ifadesinden sonraki blok, sağlanmazsa else kısmı olarak koşulun sağlanması durumu bloğundan sonraki blok çalışacaktır. Yani “Lisp’de else ve else if deyimi yok”.
#lang racket
(define a 6)
(define b 5)
(if (> a b)
(print "a greater than b")
(if(< a b)
(print "a lesser than b")
(print "a equal b")))