LOGO Öğreniyoruz (5)
Kaplumbağanın ve çizdiği çizgilerin rengini belirleyen işlem PENCOLOR ya da kısaca PC'dir; ekran zeminin rengini belirleyense BACKGROUND ya da BG... Her iki komut da 0 ilâ 15 arasında yeralması gereken tek bir parametre alır. Ancak bu noktada kafa karıştırıcı bir şey var. Bildiğiniz gibi, C-64'ünüzde renklerin klavye üzerinde belirtilmiş sayısal değerleri 1 ilâ 8 arasında yeralır. Oysa LOGO'da renkler 0'dan başlayarak numaralanır. Aşağıda LOGO'da her rengin sayısal karşılığını bulacaksınız:
Renk Sayısal değeri Siyah 0 Beyaz 1 Kırmızı 2 Cyan 3 Mor 4 Yeşil 5 Mavi 6 Sarı 7 Turuncu 8 Kahverengi 9 Açık kırmızı 10 1. Gri 11 2. Gri 12 Açık yeşil 13 Açık mavi 14 3. Gri 15
Yalnız unutulmamalı ki, PC ve BG komutları yalnızca çizim ekranı için geçerlidir. Metin ekranında yazının rengi TEXTCOLOR, zeminin rengi ise TEXTBG komutları ile belirlenir. Aynen PC ve BG gibi bunlar da 0 ila 15 arasında yeralması gereken sayısal birer parametre alırlar. Madem ekranın nasıl renklendirileceğini gördük, şimdi bu imkandan yararlanıp renkli bir güneş çizelim. Bunun için iki işlemden yararlanacağız. Birincisi bir dörtgen çiziyor:
TO DORTGEN
REPEAT 2 (FD 60 RT 30 FD 60 RT 150)
END
Bu sabit işlemi mutlaka disketinize kaydedin. Daha sonra sık sık başvuracağımız için, renkli güneşimizin bir parçası değil de, ayrı bir işlem olarak tanımladık. Şimdi bu dörtgeni her defasında beş derece sağa döndürerek 72 kere tekrarlarsak, güneş şeklini elde ederiz.
TO GUNES
MAKE “X 1
REPEAT 72 (PC:X4 1 DORTGEN RT 5)
END
Ama bu işlemi çalıştırdıktan bir süre sonra bir problemle karşılaşacaksınız. Yani şöyle bir hata mesajı belirecek. PC DOESN'T LİKE 16 AS İNPUT İN LİNE vs. diye. Yani PC komutu parametre olarak 16'yı beğenmiyor. Bu da çok doğal; en yüksek renk kodumuz 15'ti.
Bu sorunu çözmenin iki yolu var, biri dolambaçlı ve kolay, ikincisi yalın ve nisbeten daha çok şey bilmeyi gerektiriyor. Dolambaçlı ve kolay olanı ile başlayalım.
Koşullu Komutlar
Şimdiye kadar sık sık, Logo'nun mantığının Basic ve hatta Pascal gibi diğer dillerden hatırı sayılır ölçüde farklı olduğunu söyleyip durduk. Tabii her genelleme gibi bunun da istisnaları var. Bir tanesini de gördük bile; koşullu komutların, daha da açıkçası IF... THEN... ELSE'in kullanımı Logo'da da diğer dillerdekine benziyor. O halde koşullu komutları kullanarak renkli güneş çizen işlemimizi şu şekilde yeniden yazabiliriz.
TO GUNES
MAKE “X O
REPEAT 72 (IF:X — 15 THEN MAKE “X O ELSE
PC:X4 1 DORTGEN RT 5S)
END
İşlem bu şekilde yazıldığında, renk değeri 15'e ulaştığında (yani kaplumbağa grinin üçüncü tonunu aldığında), kaplumbağa renk değiştirmeyecek, yani dörtgeni iki kere üstüste üçüncü gride çizecek ancak bir dahaki sefere renk dizisine 0'dan, yani siyahtan yeniden başlayacaktır.
Aritmetik İşlemlerin Öncelik Sırası: Logo işlemlerinin diğer dilleri andırdığı ikinci bir alan da aritmetik hesaplamalar alanıdır. Bir kere bütün aritmetik işlemlerin işaretleri, bütün diğer dillerden tanıdığımız işaretlerdir:
Toplama + Çıkarma - Çarpma * Bölme / Ayrıca, hesaplamaların öncelik sırası da diğer dillerde olduğu gibidir. Yani önce parantezler kontrol edilir ve ilk olarak en iç parantezler içindeki hesaplamalar yapılır. Bütün parantezler bittikten sonra soldan sağa doğru olmak üzere, önce çarpma ve bölmeler daha sonra ise toplama ve çıkarmalar yapılır.
Komutlar, Hesaplar ve Çıktıları
Genel bir kural olarak şunu söyleyebiliriz: Eğer herhangi bir Logo komutu, parametre olarak bir sayısal değer alıyorsa, parametre olarak bir hesaplama da alabilir. Yani, FD 4 yazabileceğimiz gibi, FD 3 * 1 de yazabiliriz. Şimdi Logo ve Basic arasındaki önemli bir farka geliyoruz. Bildiğiniz gibi, Basic'te bir aritmetik işlemi, doğrudan doğruya bir program satırı olarak giremezsiniz. Örneğin,
10+4*3 meşru bir Basic program satırı değildir. Meşru bir program satırı olmadığı gibi, program yazmıyorken, yani etkileşimli moddayken de sonucu almak istediğiniz herhangi bir hesaplamayı doğrudan doğruya yazamazsınız. O hesaplamayla ne yapmak istediğinizi bildiren bir komut, hiç değilse bir PRINT komutu vermeniz gerekir. Aynı seçenek Logo'da da mevcuttur. Yani, örneğin 48'in karesini almak istiyorsanız, Logo'da da PRINT 48*48 ya da komutun kısaltmasını kullanarak PR 48*48 yazabilirsiniz. Ama Logo'da etkileşimli modda doğrudan doğruya sonucunu öğrenmek istediğiniz hesaplamanın kendisini girebilirsiniz. Örneğin, PR 48*48 yazmak yerine doğrudan doğruya 48*48 yazabilirsiniz ve Logo size hemen yine RESULT: 2304 diye cevap verecektir.
Bu yüzeysel bir kolaylık farkı gibi görünmekle birlikte, aslında Logo dilindeki temel bir kavramın, “çıktı” (output) kavramının oynadığı merkezi role işaret ediyor.
Sonuçlar ve Çıktılar
Herhangi bir bilgisayar dilinde komutlar, bilgisayara bir dizi iş yapması için verdiğiniz talimatlardır. Bu bakımdan, her komutun, tanımı gereği bir sonucu vardır. Örneğin FD X komutunun sonucu, “kaplumbağanın X birim ilerlemesidir”. Ama bu her iki komut birer “çıktı” üreten bir komut değildirler. Başka bir deyişle, bu komutların yolaçtıkları işlem sonucunda, yeniden kullanılabilecek yeni bir değer üretilmiş olmaz. Oysa bütün aritmetik hesaplamalar, sonuç olarak bir çıktı üreten işlemlerdir. Logo da, etkileşimli tarzındayken, yani siz TO X komutu ile editöre girmemişken, ürettiği bütün çıktıları, RESULT: diyerek size anında yansıtır.
Ancak burada dikkat edilmesi gereken çok önemli bir nokta var. Etkileşimli tarzdayken bir hesaplamayı doğdoğruya girebileceğiniz, aynı şeyi bir işlem (procedure) yazarken de yapabileceğiniz anlamına gelmiyor. Çünkü, bunu yaptığınız takdirde, işlem sırasında Logo bir çıktı üretecek ve bu çıktıyla ne yapacağını bilemeyecektir. Dolayısıyla işlem yazarken herhangi bir aritmetik hesaplama yaptırmak istiyorsanız, aynen Basic'de olduğu gibi, hesaplamayı yaptırdığınız satırda, bu hesaplamanın sonucu ile de ne yapılacağını bilmek zorundasınız. Aslında bu daha genel kuralın bir özel hali. Daha sonraki bölümlerde göreceğimiz gibi, listeleri manipüle eden kimi komutlar da çıktı üretirler. İşlem yazarken çok dikkatli olunması gereken bir nokta, bu çıktılarla ne yapılacağının daima ve anında belirtilmesidir.
Artık Logo'nun bünyesinde yeralan ve hepsi de birer çıktı üreten bütün temel aritmetik işlemleri görebiliriz.
1541'i
TUNA ERTEMALP
Merhaba arkadaşlar... Bu ayki konumuza başlamadan önce, ufak bir yanlış anlamayı düzeltelim. Eğer bu yazı dizisinin devamlı okuyucularından (eskilerin deyimiyle, müdavimlerinden) iseniz, geçen sayıda yayınlanan dördüncü bölümün son bölüm olduğunun açıklandığını hatırlarsınız. Hem de iki kere, hem yazının başında hem de fihrist bölümünde... Şimdi de karşınıza pat diye beşinci bölümü getiriyoruz. Olay şuradan kaynaklanıyor. Bendeniz yaz boyunca İsviçre'de yaz stajımı tamamlamaya gitmeden önce dizimizin ilk dört bölümünü yazıp teslim etmiştim. Döndüğümde devam edeceğimi de belirtmiştim. Ancak, o sıralarda askerlik görevini sürdüren yayın yönetmenimiz Ziya Bayman, benim bu belirtmemi duyamamış, dördüncü bölümü dergiye basarken elinde beşinci bölümün olmadığını görünce de, biraz da askerlikten yeni çıkmış olmanın getirdiği sarhoşluktan olsa gerek, dizinin bittiğine kanaat getirmiştir. Neyse, düzeltir, okurlarımızdan özür dileriz... Gelelim bu ayki konumuza. Artık gittikçe ciddileşiyoruz. Bugüne kadar, genel disket tarihini ve yapısını, BASIC kullanarak 1541'e hitap etmeyi ve bu alete değişik komutlar göndermeyi öğrendik. Şimdi ise, disketimizin derinliklerine inip, dükkândan aldığımız o dışı kare içi plak şeklindeki şeyin 1541 tarafından nasıl kullanıldığını, bilgilerin üzerinde nasıl organize edildiğini açığa çıkaracağız. Bu araştırmamızda yalnız olmayacağız. Bize DISKMON adını verdiğimiz bir program yardımcı olacak. DISKMON da ne? diyorsanız, yazımızın geri kalanını da okumanızı tavsiye ederiz. Artık işe girişelim. Daha ilk bölümde, bilgilerin disketlere belli bir düzen içinde yazıldığını, bilgilerin disket üzerinde TRACK ve SECTOR adını verdiğimiz bölümlere kaydedildiğini belirtmiş, ama pek de fazla derine inmemiştik. Acaba TRACK gerçekte nedir, ya SECTOR ne ola? Bir disket fabrikadan çıktığında TRACK/SECTOR nedir, bilmez. Bu tamamen, o disketi kullanan disket sürücüsünün (bizim durumumuzda 1541'in) yorumuna, disket üzerinde-