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.
yarag
YanıtlaSil