1 Başlarken

1 Başlarken

Geleneğe bağlı kalmak adına Lua 'daki ilk programımız sadece "Merhaba Dünya" yazdıracak:

print("Merhaba Dünya")

Bağımsız Lua yorumlayıcısını(lua.exe veya luajit.exe) kullanıyorsanız ilk programınızı yürütmek için yapmanız gereken tek şey programınızı içeren metin dosyasının adı ile yorumlayıcıyı çağırmaktır. Eğer merhaba.lua adını verdiğiniz dosyaya yukarıdaki programı yazarsanız devamdaki komutu çalıştırmalısınız:

%lua.exe merhaba.lua

Daha bir komple örnek olarak sıradaki programımız verilen bir sayının faktöriyelini hesaplayacak bir fonksiyon tanımlayıp, kullanıcıdan bir sayı ister ve onun faktöriyelini yazdırır:

-- faktöriyel fonksiyonu tanımlaması
function fakt(n)
    if n == 0 then
        return 1
    else
        return n * fakt(n - 1)
    end
end

print("bir sayı girin:")
a = io.read("*number") -- sayı oku
print(fakt(a))

Bir uygulamaya tümleşik olarak Lua'ı kullanıyorsanız (ZeroBrane IDE gibi) programlarınızın nasıl yürütüleceğini öğrenmek için o uygulamanın kılavuzuna(veya forumlarındaki gurularına) başvurmanız gerekebilir. Ne olursa olsun Lua yine aynı dil; burada göreceğimiz çoğu şey Lua'ı nasıl nerede kullandığınıza bakılmaksızın geçerlidir. İlk deneylerinizi ve örneklerinizi yürütmek için bağımsız yorumlayıcıyı(lua.exe) kullanarak Lua çalışmalarınıza başlamanızı öneririm.

1.1 Öbekler

Lua tarafından işletilebilir bir kod dosyası veya interaktif modda yazılmış tek satırlık her bir kod parçasına öbek (chunk) denir. Öbek basitçe komutlar (veya deyimler) dizisidir.

Lua'da ardışık deyimler arasında ayırıcıya gerek yoktur ancak isterseniz noktalı virgül kullanabilirsiniz. Kişisel tercihim sadece aynı satırda yazılmış iki veya daha fazla deyimi ayırmak için noktalı virgül kullanmaktır. Satır sonu Lua 'nın söz diziminde rol oynamıyor; örneğin aşağıdaki dört öbeğin tümü geçerli ve eşdeğerdir:

a = 1
b = a*2

a = 1;
b = a*2;

a = 1; b = a*2

a = 1 b = a*2 -- nahoş, ama geçerli

Öbek, "Merhaba Dünya" örneğindeki gibi tek bir deyimlik kadar basit olabilir ya da faktöriyel örneğindeki gibi fonksiyon tanımlamaları(aslında atamadırlar daha sonra göreceğiz), deyimler karışımından da oluşabilir. Bir öbek dilediğiniz kadar büyük olabilir. Lua veri-tanımlama dili olarak da kullanıldığı için yaygın olmasa da birkaç megabaytlık öbek kullanılabilir. Lua yorumlayıcısının büyük öbeklerle hiç bir sorunu olmayacaktır. 

Programınızı bir dosyaya yazmak yerine interaktif modda bağımsız yorumlayıcıda da çalıştırabilirsiniz. Herhangi bir argüman olmadan lua.exe 'i çalıştırırsanız  komut istemcisinde şunu alacaksınız:

Lua 5.1 Copyright (C) 1994-2006 Lua.org, PUC-Rio
>

Bundan sonra yazdığınız her komut (örneğin, print("Merhaba Dünya") ) enter'a bastıktan hemen sonra işletilir. Etkileşimli moddan ve yorumlayıcı 'dan çıkmak için dosya-sonu kontrol karakteri (POSIX 'de CTRL-D, Windows 'da CTRL-Z) veya Lua'nın işletim sistemi kütüphanesinden os.exit() yazarak çıkış fonksiyonunu çağırmanız gerekir sadece.

İnteraktif modda Lua yazdığınız her satırı tamamlanmış bir öbek olarak yorumlar. Ancak satırı tamamlanmamış bir öbek formu olarak tespit ederse öbek tamamlanıncaya kadar daha fazla girdi bekler.  Bu şekilde doğrudan etkileşimli modda faktöriyel fonksiyonu gibi çok satırlı bir tanımlama girebilirsiniz. Tabi bu tür tanımlamaları bir dosyaya yerleştirip sonra bu dosyayı çalıştırmak için Lua 'ı çağırmak genelde daha kolaydır.

Lua 'a verilen öbek çalıştırdıktan sonra etkileşimli oturum başlatması talimatı vermek için -i seçeneğini kullanabilirsiniz. Devamdaki gibi bir komut satırı

%lua.exe -i program.lua

program.lua dosyası içindeki öbeği çalıştırır ve sonra etkileşim için size dönüş yaptırır. Bu özellikle hata ayıklama ve el yordamıyla testler için kullanışlıdır. Bu bölümün sonunda lua.exe için diğer seçenekleri de göreceğiz.

Öbekleri çalıştırmak için başka bir yöntem de verilen dosyayı hemen işlettiren dofile fonksiyonudur . Örneğin aşağıdaki kodun lib1.lua adlı dosyanızda olduğunu varsayalım:

function norm(x, y)
    return (x ^ 2 + y ^ 2) ^ 0.5
end

function katla(x)
    return 2 * x
end

Sonra interaktif modda şöyle yazabilirsiniz:

> dofile("lib1.lua")              -- kütüphanenizi yükler
> n = norm(3.4, 1.0)
> print(katla(n))                  --> 7.0880180586677

dofile fonksiyonu da yine bir kod parçası sınaması yaptığınızda yararlıdır. İki pencere ile çalışabilirsiniz: biri programınızı yazdığınız(program.lua dosyası) metin editörü diğeri etkileşimli modda Lua 'nın çalıştığı konsol. Programınızda bir değişikliği kaydettikten sonra yeni kodun yüklenmesi için Lua konsolunda dofile("program.lua") 'i işlettirirsiniz; sonra fonksiyonlarının çağrılmasında, sonuçların yazdırılmasında yeni kodu tatbik edebilirsiniz.

1.2 Bazı Sözcük Kuralları

Lua 'da tanımlayıcılar herhangi harf dizesi, sayılar ve alt çizgi olabilir ama sayı ile başlayamaz; Örneğin:

i j i10 _ij
aHerhangiUzunIsim _INPUT

Alt çizgi ile başlayan bir veya çoklu büyük harfli tanımlayıcılardan(örn., _VERSION) kaçınmalısınız; Bunlar Lua'da özel kullanımlar için ayrılmıştır. Kukla değişkenler için _ (tek alt çizgi) tanımlayıcısını rezerve ettim.

Lua 'da yazım konsepti yerelleştirme ayarına bağlıdır. Uygun bir yerelleştirme ayarı ile ağaç veya özlük gibi türkçe değişken adları kullanabilirsiniz. Ancak bu tür adlar programınızın bu yerelleştirmenin desteklenmediği sistemlerde çalıştırılmasını elverişsiz hale getirecektir.

Aşağıdaki sözcükler rezerve ediliktir; Bunları tanımlayıcılar olarak kullanamayız:

and break   do    else elseif
end false for function if
in local nil     not        or
repeat return  then true until
while

Lua büyük/küçük harf duyarlıdır: and ayrılmış bir kelimedir ancak And ve AND iki farklı tanımlayıcıdır.

Açıklama-yorum, çift tire (--) ile herhangi bir yerden başlatılıp satır sonuna kadar sürdürülebilir. Lua aynı zamanda --[[ ile başlayıp gelecek ]]  'e kadar sürdürülebilen açıklama blokları da sağlar(Aslında blok yorumlar 2.4 bölümünde göreceğimiz üzere bundan daha kompleks olabilir). Yaygın bir numara olarak kod parçasının yorum olarak muamele edilmesini istiyorsak kodlarımızı --[[ bu araya --]]  iliştiririz, şöyle ki:

--[[
print(10)                -- aksiyon yok (yorum)
--]]

Kodu yeniden etkinleştirmek için ilk satıra tek bir tire ekleriz:

---[[
print(10) --> 10
--]]

ilk örnekte   son satırdaki -- 'e kadar yorum bloğundayız. ikinci örnekte ilk satıra bir tire ekleyerek,     ---[[ , blok yorum tek satırlık yoruma döndürülüyor. Böylece ilk ve son satırlar bağımsız yorum haline gelir. Bu durumda print yorum dışında kalır.

1.3 Global değişkenler

Global değişkenlerin deklarasyonu gerekmez. Yalnızca bir değer ataması global değişkeni oluşturur. Değer atanmamış bir değişkene erişmek bir hata değildir; sadece sonuç olarak nil özel değerini alırsınız: 

print(b) --> nil
b = 10
print(b) --> 10

Genelde global değişkenleri silmeniz gerekmez; değişkeniniz kısa bir hayata sahip olacaksa lokal değişken kullanmalısınız. Ancak global bir değişken silmeniz gerekirse yapmanız gereken sadece ona nil atamakdır:

b = nil
print(b)          --> nil

Bu atamanın ardından Lua değişken hiç kullanılmamış gibi davranır. Diğer bir deyişle global değişken yalnızca(ve yalnızca) nil olmayan bir değere sahipse vardır.  

1.4 Bağımsız yorumlayıcı

Bağımsız yorumlayıcı (kaynak kod dosyasının adı lua.c o yüzden işletilebilir dosya adı da lua.exe ) Lua'yı direkt kullanmaya imkan veren küçük bir program. Bu bölümde ana seçenekleri sunulacak. 

Yorumlayıcı bir dosyayı yüklediğinde  dosyanın ilk satırının başında diyez (#) varsa bu ilk satırı yok sayar. Bu özellik  Lua'nın UNIX sistemlerinde bir script yorumlayıcısı olarak  kullanımına imkan verir. Devamdaki gibi scriptiniz başlıyorsa:

#!/usr/local/bin/lua

(bağımsız yorumlayıcının /usr/local/bin konumunda olduğu varsayılmakta) veya

#!/usr/bin/env lua

o zaman Lua yorumlayıcısı(lua.exe) açık açık çağrılmadan direkt script'i çağırabilirsiniz.

lua.exe kullanımı:

lua.exe [seçenekler] [script [argümanlar]]

Hepsi opsiyonel. Zaten görmüştük, argümansız lua.exe 'i çağırdığımızda yorumlayıcı etkileşimli moda girer. 

-e seçeneği devamdaki gibi komut satırına doğrudan kod girmemize imkan verir:

%lua.exe -e "print(math.sin(12))" --> -0.53657291800043

(UNIX'de komut isteminin(shell) parantezleri yorumlamasını es geçirmek için çift tırnak gerekir.)

-l seçeneği kütüphane yükler. Daha önce gördüğümüz gibi -i diğer argümanlar çalıştırdıktan sonra etkileşimli moda girdirir. Yani örneğin şu çağrı ile:

%lua.exe -i -l a -e "x = 10"

lua.exe, a kütüphanesini yükleyecek sonra x = 10 atamasını işletecek ve son olarak etkileşim için sizi komut istemine düşürecek.

_PROMPT global değişkeni tanımlanmışsa lua.exe etkileşim sırasında istem sembolü olarak onun değerini kullanır. Yani devamdaki çağrı ile lua.exe 'nin istem sembolünü > yerine lua> yapabiliriz:

%lua.exe -i -e "_PROMPT=' lua> '"

lua>

"%" 'nin komut sistemcinin(shell) istem sembolü olduğunu varsayıyoruz. Örnekte çift tırnaklar, tırnak içlerinin Lua tarafından yorumlanıp shell tarafından yorumlanmasını es geçirir. Daha açık bir ifade ile Lua çalıştırmak üzere aşağıdaki komutu alır:

PROMPT=' lua> '

Bu,  _PROMPT global değişkenine  lua>  stringini atar.

Etkileşimli modda herhangi bir ifadenin değerini  eşittir işaretiyle başlatarak yazdırabilirsiniz:

> = math.sin(3)        --> 0.14112000805987
> a = 30
> = a                       --> 30

Bu özellik bir hesap makinesi gibi Lua 'nın kullanılmasına imkan verir.

lua.exe argümanlarını çalıştırmadan önce  LUA_INIT adlı bir ortam değişkeni arar. Böyle bir değişken var ve içeriği @dosyaismi ise lua.exe verilen bu dosyayı çalıştırır. LUA_INIT tanımlanık ancak '@' ile başlamıyorsa lua.exe onun Lua kodu içerdiğini var sayar ve onu yürütür. Yapılandırmada Lua 'nın bütün gücüne sahip olduğumuzdan LUA_INIT bize bağımsız yorumlayıcıyı yapılandırırken büyük güç verir. Paketleri önyükleyebilir , prompt ve dizini değiştirebilir, kendi fonksiyonlarımızı tanımlayabilir,  fonksiyonları yeniden isimleyebilir veya silebiliriz vb.

Bir script, global değişken arg 'den argümanlarını elde edebilir. Şöyle bir çağrıda

%lua.exe script a b c

lua.exe, script'i(Lua programımızı yazdığımız dosya) çalıştırmadan önce tüm komut satırı argümanları ile arg tablosunu oluşturur.  script'in adı '0' indeksine , ilk argüman (örnekte "a") 1 indeksine gider vb.  Daha önceki seçenekler script'ten önce geldiklerinden negatif indekslere gider. Örneğin şu çağrı da

%lua.exe -e "sin=math.sin" script a b

lua.exe argümanları aşağıdaki gibi toplar:

arg[-3] = "lua"
arg[-2] = "-e"
arg[-1] = "sin=math.sin"
arg[0] = "script"
arg[1] = "a"
arg[2] = "b"

Ekseriye zaten script yalnızca pozitif indeksleri kullanır ( örnekte arg[1] ve arg[2]).

Lua 5.1'de  bir script  argümanlarını aynı zamanda vararg sözdizimiyle de elde edebilir. script'in ana gövdesinde ...(üç nokta) ifadesi script'e argümanları sağlar. 5.2 bölümünde vararg sözdizimini ele alacağız.

1 yorum: