Bu sayfadaki yazılar
Sayfanın metni
Sayfa 60
Önemli Bir Sorun
LISP sembol manipülasyonuna yönelik bir bilgisayar dilidir. Alfanümerik karakterler gösterebilmek gibi bir yan özelliği vardır ve bu dille birisi bir arcade oyunu yazabilir ama asıl özelliği büyük veri akışlarını iş-
Gövdeler
LISP, Basic'ten yeni yapay zeka dilleri tarafından kullanılan bu bir dizi yüklem üzerine kurulmuş olmasıyla da ayrılır: (RENKLER (KIRMIZI BEYAZ MAVİ)) LISP bunların yazılması durumunda verdiğimiz veriyi aynen yazacaktır, ama tırnak işaretini kaldırırsanız LISP yorumcusu TANIMLANMAMIŞ hata mesajını verecektir. Değişkene SETQ denilen bir komutu kullanarak bir ad verebilirsiniz, bu değişkene BASIC dilindeki LET emri (statement) gibi bir değer verir.
SETO RENKLER '(KIRMIZI BEYAZ MAVİ)
Görüldüğü gibi, değişkende depolanan değer, ya bir tırnak işaretini izleyen bir ifade ya da bir LISP fonksiyonuna referans olabilir. (Bu BASIC'te bir “komut” ya da “anahtar sözcük” olarak bilinir.) Değişkenin adını tırnak işareti olmadan girersiniz. SETQ emrinin verdiği değer oluşturulacaktır. Aynı microPROLOG'ta olduğu gibi, LISP programlama yöntemlerimize tamamıyla yeni bir yaklaşım getiriyor. Bu anlamda LISP ve microPROLOG arasında birçok benzerlik var, bu benzerlik dilin kendisini oluşturması sürecine kadar uzanıyor ama akış şeması kavramını programcılık ideolojimize aşıladığı “birbirini izleyen akış” düşüncesinden uzaklaşmamız gerekiyor. Bu yaklaşım BASIC, COMAL gibi dillerde hâlâ devam ediyor. Bir informasyon listesini düşünün? Onda en sonuncusu dışında birbirini izleyen bir dizi veri olur. LISP listeleri uzunluklarından bağımsız olarak aynı şekilde ele alınabilecek bir nesneler grubu olarak görmek yanlıştır. Listelerin bir seferde bir öğe aşılarak katedilebileceği düşüncesi son derece yararlı oluyor. Bunun yanısıra LISP tanımlayıcı ve rakamların listelere serbestçe karışmasına da olanak veriyor. Her şeyi pointer'larla halledebilmenin bir yolu bu. Listelere gelince, bu pointer'lar tek bir veri birimini saptayacaktır. Buna hücre denir ve her yarısı başka bir pointer içermektedir. Soldaki pointer (hücredeki ilk olan) depolanmış listedeki ilk öğeye götürür, sağdaki de geriye kalanı işaret eder. Böylece (A listesi için tablo şekil 1'de görülebilir. Böyle listeler alt listeler halinde düzenlenebilir ya da derinlemesine düşey olarak tasarlanabilir. Bunu şekil 2'de görebilirsiniz. Herhalde şimdiye kadar LISP'in neden bu kadar iyi bir genel amaçlı database oluşturma dili olduğu anlaşılmıştır. Çünkü bir database'te içkin olan tüm fonksiyonlar ve data yapıları yapısında mevcuttur.
Testler ve Karşılaştırmalar Bir fonksiyonu, tek bir çağırma ile, yapılaştırılmış informasyonun inşa edilebileceği, depolanabileceği ya da alınabileceği şekilde tanımlayabilmek
LISP'in genel bir özelliğidir. Dahası, bazı insanların “zeka” dediğini kullanma yeteneğine sahip fonksiyonlar yazılabildikten, yani bir fonksiyondan çıkan datayı tartışıp o bulgulara göre sonra ne yapılacağı konusunda karar verebilen bir işlem olduktan sonra çok daha ilginç programlar yazılabilir. Diğer bir deyişle, LISP veriler üzerinde testler ve aralarında karşılaştırmalar yapmaya ihtiyaç duyar. En yaygın testler olan EQ, ATOM ve NULL Boolean nicelikleri “doğru” ve “yanlışı” veren değerler çıkartır. Acornsoft LISP'te, NIL “yanlışı” temsil eder. Onun yanısıra, bir data yapısı diyagramının sonunda bulunan boş listeyi de temsil eder. “Doğru” bir fonksiyondan gelen datanın “yanlış” olmadığı her durum sayılmaktadır. Bu nedenle T sözcüğünü bu niceliği tescil etmek üzere kullanabiliriz. (Aynı şekilde F de yanlışı temsil edebilir.) “Doğru” değerler verdikleri düşünülen LISP fonksiyonları predicate (yüklem) olarak bilinir. Ama kullanım alanları, COND, özel fonksiyonunu kullanarak oluşturulan conditional (koşullu) ifadelerle birliktedir. Bu çeşit ifadelerin genel ifadesi şöyledir: (COND (yüklem 1 ifade 1) (yüklem 2 ifade 2))
Şekil 1: LISP data yapı diyagramı
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 61
(T son ifade) İstenilen çoklukta yüklem ifade çiftleri olabilir. LISP bir COND ifade bulduğunda, verili yüklemleri sırayla incelemeye başlar. Verdiği değer, ilk yüklemle “doğru” bir değer vermek üzere eleştirilen ifadenin değeridir. Önceki örnekte, Sabit T nihai yüklem olarak kullanılıyor. Bunun değeri her zaman “doğru” olduğuna göre, buna tekabül eden son ifade hata olarak görülebilir. O halde diğer tüm yüklemlerde çıkacak sonuç “yanlış”. O zaman, parantezler olmadan koşullu biçim şöyle okunabilir:
EĞER yüklem 1 “doğru” ise O ZAMAN ifade 1'in değerini ver YADA yüklem 2 “doğru” O HALDE en son ifadenin değerini ver LISP'in bileşik yüklemlere ihtiyacı olduğu zaman, AND ve OR kullanarak onları oluşturabilir. Bu fonksiyonların her biri belli sayıda argümanla baş edebilir. Normal mantık yasaları bir sonucu varmalarını sağlayana kadar, bu birer birer değerlendirirler. Böylelikle AND argümanları listenin sonuna gelene kadar (ve T verene kadar) ya da argümanlarından biri NIL değerini verene kadar değerlendirmeyi sürdürecektir. OR değerlendirmeyi bir NIL olmayan argüman bulur bulmaz durdurup T verecektir. LISP kodunun COND, AND, OR ve NOT gibi karmaşık yapılarını gerektiren parçaları en iyi daha küçük fonksiyonların grupları olarak yeniden yazılabilirler.
Micro Üzerinde LISP Sistemi LISP kullanarak bir dizi fonksiyon yazdığınızda, bir hata yapmanız elzemdir. En nihayetinde programcılığın keyifli yönlerinden biri de budur. LISP bir hatayla karşılaştığında şöyle şeyler olur. Ya yanıtlarınızdan hiçbir anlam çıkmayacak, (en kötü hata cinsi) ya da şanslıysanız bir hata mesajı ile birlikte kafa karıştırıcı bir dizi LISP ifadesi alacaksınız.
Bu ifade listesine “back trace” -geriye dönük tarama- denir ve debugging (hataları düzeltme) işleminde size yardımcı olması beklenmektedir, ama bazı LISP sistemleri listeyi hatanın ne olabileceği ve nerede olabileceği konusunda makul tahminler yapmakta kullanır. Bir hata mesajı aldıktan sonra yapılabilecek ilk şeylerden bir hatanın gerçekten bir hata mı yoksa beklenmeyen bir sonuç mu olduğuna bakmak; bir insan yanlış yorumlaması mı? Data yapı diyagramını kullanarak programın mantığını çıkarttıktan sonra, asıl iş başlar. LISP, bir hatayı bulabilmeyi, LISP fonksiyonlarına verilen tüm nicelikleri ve sonuçların dökümü alınabildiğinden ötürü verilen tüm değerleri inceleyebileceğiniz için, son derece kolaylaştırmıştır.
Bir fonksiyonun mantıksal tutarlılığını inceleyemeyeceğiniz tek zaman, fonksiyon giriş noktalarında ve bir döngü yapısından direkt olarak çıkmak gibi yeniden giriş yapılarında sorun çıktığı zamandır. (Yeniden giriş yapısına örnek olarak, bir FOR NEXT döngüsü içinde GOTO vermek sayılabilir.)
Bunların hiçbiri para etmediyse, denen fonksiyonu çağırmanın zamanı gelmiş demektir. Bu, karmaşık bir hesapta değerlerin fonksiyonlar arasında nasıl geçtiğini anlamak için kullanılabilir. Onu kullanmanın amacı yanlış sonuçlar veren tek bir fonksiyon saptamak olabilir. Eğer yanlış fonksiyon basit bir hataysa, hatayı düzeltmek kolay olacaktır. Save edin ve yeniden
Programı deneyin. Tüm bunlar da işe yaramazsa, programcıya kalan uzun bir gece boyunca masa başında ter dökmektir.