Materyal hakkında ön bilgilendirme.
Tahmini okuma süresi: 18 dakika
Öğrenme zorluk seviyesi: Basit-Orta
@ProBaturay tarafından oluşturulan diğer bir benzersiz materyale hoş geldiniz!
Ön Söz
Okurken keyif alacağınız, gözünüzü alamayacağınız tasarımları inceleyeceğiniz, bu sayede öğrenimi kolay bir şekilde gerçekleştirebileceğiniz bu materyalde Roblox platformunun kendi uygulamalarında benimsediği Lua programlama dilinin söz dizimi kurallarını en ince ayrıntısına kadar öğrenebilirsiniz. Bu materyalde Luau diline dair hiçbir bilgi yer almamakta, sadece Lua 5.1 sürümü hakkında bilgi verilmektedir. Burada edineceğiniz bilgiler, Luau dilini anlamanızda rehber olacaktır.
Bu içerik hazırlanırken TSE Bilişim Sözlüğü (2006) kitabındaki terimlerden yararlanılmış olup Güncel Türkçe Sözlük’te karşılığı olan terimlere, güncel yazım biçimleriyle düzeltmeler yapılmıştır.
Umarım bu içerik size faydalı olacaktır. İyi okumalar!
- Lua Programlama Dili
- Lua’nın Roblox’ta Kullanılışı
-
Söz Dizimi Kuralları
- Sözcüksel Birimler ve İşaretler
- Veri Değerleri ve Türleri
- Değişkenler
- Deyimler (I)
- Deyimler (II)
- Dilin Diğer Özellikleri
- Öneriler
- Kapanış
Yaratıcıları Roberto Ierusalimschy, Luiz Henrique de Figueiredo, and Waldemar Celes olan Lua, günümüzde yediden yetmişe her yaştaki insanın kolaylıkla anlayabileceği bir türden dil olup birçok şirketin ve bireysel girişimcilerin (Adobe Photoshop Lightroom, World of Warcraft, Garry’s Mod ve en önemlisi Roblox) kullandığı bir dil hâline gelmiştir. Piyasaya sürülüş tarihi 1993’tür. Bu dil, daha çok oyun programlarında yerini almıştır.
Lua dilinin anlaşılabilirliğinin yüksek olmasının temel nedeni, insan diline yakın olması ve ortalama insan beyninin kavrayabileceği derecede bir söz diziminin olmasıdır. Ayrıca, birbirinden farklı özellikleri olan yapılar içermesi, Lua’yı yüksek seviyeli bir dil olmasını sağlamıştır.
Aynı zamanda Lua, kod parçalarında yazılan birimlerin çok hızlı işlendiği bir dildir.
Tablo 1: Lua’nın getirdiği birtakım faydalar
Roblox’un kurucuları olan Erik Cassel ve David Baszucki, programcıların kolay bir şekilde oyun oluşturabilmeleri için Lua programlama dilini tercih etmişlerdir. Bu sayede Roblox Studio’ya her yaştan insanlar; öğrenimi kolay olan, hızlı işleyen bir programlama diliyle betikler yazarak hayallerindeki yapıtları gün yüzüne çıkarırlar.
Roblox’ta oluşturulan oyunların çoğu, zamanla programlama dili sayesinin kullanımıyla tanınmıştır. Birinin programlama dilini kullanması, onun bilgisayar programcısı unvanına sahip olduğunu gösterir. Roblox’taki bilgisayar programcıları, hem bireysel olarak oyun çıkarabilir hem de birtakım insanlardan oluşan gruplara katılarak oyunlar için betik yazabilir.
Programcıların yazdığı betiklerle oyunların ilgi çekmesi, oyuncuların platforma para yatırmasına ve sanal para kullanmasına zemin hazırlar. Bu sanal para oyun içi işlemlerde kullanıldığında (örn. oyun içinde kullanılan başka bir para birimini yükseltme, belirli bir süre için geçerli olan eşyalar vb.) geliştiricilere kazandıkları toplam sanal paranın %30’unun pazar yeri ücreti olması suretiyle %70’i geliştiricilere bırakılır (bu yüzde değerleri konuya göre değişebilir). Bu sanal para, belirli bir miktarı aşınca tekrar gerçek hayatta kullanılan para birimine dönüştürülebilir (örn. 100,000 sanal para için 350 dolar).
Geliştiricileri motive eden para kazanma isteği, çoğunlukla Lua programlama dilini etkin bir şekilde kullanmaktan geçer. Bunun için, Lua’nın sindirilmesi gerekmektedir. O hâlde, öncelikle söz dizimi kurallarının öğrenilmesi şarttır. Lua’nın anlam bilimi çerçevesindeki davranışlarından ziyade söz dizimi kurallarının daha önce öğrenilmesi, dili öğrenmenize kolaylık sağlar.
Roblox, ilk günden beri Lua’nın 5.1 sürümünü kullanmaktadır. Lua 5.1 sürümünün bütün özellikleri Roblox’ta yer almaz çünkü bazı özellikler, programlama dilinin kullanılış amacının dışına çıkmaktadır. Aynı zamanda, Lua 5.1 sürümünün ileri sürümlerinde eklenen bazı özellikler, Roblox Lua’da mevcuttur çünkü kullanılmaları kolaylık sağlar. Lua 5.1 sürümünde var olan özelliklerin yaklaşık %85’inden fazlası, Roblox Lua’da kullanılabilir durumdadır. Kullanılamayan durumlara örnekler: “io, package” kütüphanelerinin kullanımdan kaldırılması, “os
” kütüphanesinde “execute
” komutunun kaldırılması…
Sözcüksel Birimler ve İşaretler
Programlamanın söz dizimi kurallarına göre, birkaç sözcük diğer bütün kelimelerden ayrı yazılmalıdır çünkü yazılan programın istendiği gibi işleyebilmesi için bu sözcüklerin kullanılması gerekmektedir. Eğer bu sözcükler olmasaydı böyle bir programlama dili de olmazdı.
Tablo 2: Birtakım görevleri yerine getirmek üzere kendilerine yer ayrılmış kelimeler
Bu tabloda geçen kelimeler, bütün harfleri küçük olması şartıyla ve hem başında hem sonunda en az bir tane beyaz boşluk karakteri bulundurma suretiyle yazılabilir. Beyaz boşluk karakteri şöyle tanımlanabilir: Arayüz oluşturma sürecinde günlük hayatta kullanılan harf ve sembollerin kullanımı sırasında arada bir girinti bırakan bilgisayar karakterleridir. Örneğin, 1. kod bloğu doğru bir şekilde çalışırken ikincisi söz dizimi hatası verir. Çünkü “do
” ve “print
” kelimeleri, ayrı birimler hâlinde, aralarında boşluk karakteri olacak şekilde yazılmalıdır.
Kelimelerden bahsetmişken, aynı durum birkaç sembol için de geçerlidir. Semboller, çeşitli matematiksel işlemleri yapabilme, program yazarken karışıklığı önleme, doğruluk tespitinde rol alma gibi yetenekleri olan bilgisayar karakterleridir.
Semboller, işlevini gördüğü sürece kelimelere hem bitişik hem ayrı yazılabilir. Aşağıda görüldüğü üzere, sembollerin bazıları kelimelere bitişik ve kelimelerden ayrı yazılmıştır fakat bu, programın yürümesine engel olmamıştır. Boşluk karakterleri silindiğinde oluşan her aynı satır, birbirinin aynısı olan görevi üstlenmiş olur.
“#
” sembolü, bir dizgide kullanılan toplam karakter sayısını gösterir.
Veri Değerleri ve Türleri
Programlama dillerinde veri türleri çok önemli bir yere sahiptir. Örneğin edebiyat derslerinde metin yazma, bireysel olarak kitap okuma esnasında Türkçe karakterler görürüz. Bunun bilgisayarda karşılığı string
(dizgi, dizi) türüdür. Çevrim içi banka, blok zinciri işlemlerinde sayılar kullanılırken bu veri türleri number
(sayı) ile ifade edilir ve bunun da alt dallarına ayrılan float
(kayan noktalı sayı), integer
(tam sayı) gibi kavramları vardır. İşte bunlar, türler olarak tanımlanır.
Türler üzerine daha ayrıntılı bir bilgi edinmek için bu adrese gidebilirsiniz.
Lua’da değerler, bir türün taşıyabileceği farklı anlamları ifade eder. Örneğin; 1, 2, 3.5 sayıları birer değerdir ama hepsinin türü number
olur. Her bir değerin türü vardır. Lua’da bütün değerler birinci sınıf değerlerdir. Bunun anlamı; değerler bir değişken olarak atanabilir, fonksiyonlarda parametre ve geri dönüş argümanı olarak kullanılabilir.
Bazı değerler olabilir ki aynı tür gibi gözükmesine rağmen farklı türler olabilir. Aşağıdaki kod parçasında birinci olarak yazdırılan değerin türü string
iken ikincisinde number
olur. Bunun sebebi, string
oluşturmak için çift tırnak işareti kullanılmışken number
oluşturmak için sayının kendisi açık bir şekilde yazılmıştır.
O zaman şunu çıkarabiliriz ki aynı iki değerin türü de aynıdır. Farklı iki değerin türü aynı da farklı da olabilir.
Değişkenler
Adı üzerinde, değişkenler; kendilerine değer atanabilen, istenildiği zaman istenildiği yerde kullanılabilen bir söz dizimi kuralıdır.
Değişken oluşturulurken şunlar göz önünde bulundurulmalıdır:
- Değişkenin ismi, İngilizce alfabesinde yer alan harfler dışındaki harflerle oluşturulamaz.
- Değişkenin ismi, sayı olarak yazılan hiçbir rakamla başlayamaz.
- Değişken ismi yazılırken alt çizgi “_” işareti kullanılabilir. İşaret; başta, ortalarda ve sonda bulundurulabilir. Bir kere yazılabildiği gibi daha fazlası da yazılabilir.
Üç tür değişken vardır: genel, yerel ve tablo indis-değer, anahtar-değer alanları.
Değişkenler, değer atanmadan önce ilk değer olarak nil
değerine sahiptir. İlk eşittir işaretiyle değişken değeri belirlenmiş olur.
Değişkenleri atamada sadece bir eşittir “=” kullanılır. İki eşittir “==” ve eşit değildir “~=” değer karşılaştırmalarında kullanılır.
1) Genel değişken
Bu tür değişkenler; sadece değişken ismi, bir tane eşittir işareti ve değerin kendisi kullanılarak oluşturulur. Aşağıda a
, b
, c
değişkenlerinde değişkenin ismi kendileridir. Eşittir işaretinin sağ tarafında kalanlar değeri göstermektedir.
Genel değişkenler, aynı zamanda herhangi bir deyim içinde de yazılabilir ve deyim dışında da kullanılabilir.
Betikte var olmayan genel bir değişkenin ismi geçiyorsa bu değişkene otomatik olarak nil
değeri atanır.
Genel değişkenlerin bariz başka bir örneği, çokça kullanılan yerleşik değişkenlerden olan;
table
,string
,math
, özellikle Roblox nesne hiyerarşi modelinin en başını oluşturangame
değişkenleridir.Bu değişkenler için “Betikte tanımlı değil.” demek yanlış olur. Bu genel değişkenler, Lua’nın kendi yorumlayıcılarında yerleşiktir. Örneğin, aşağıdaki kod parçasında
string
kütüphanesi, Lua tarafından tanındığı için renklendirilmiştir. Bu durum, aynı zamanda
2) Yerel değişken
Genel değişkenden farklı olarak, bu değişkenler belli deyimler ve fonksiyonlar için kullanılır. Bu tür değişkenlerin belli bir kapsamı vardır. Bu kapsam dâhilinde olan deyimler ve fonksiyonlar yerel değişkenleri kullanabilirken bu kapsam dışındakiler, kullanamazlar.
Yerel değişken oluşturmak için bir local
kelimesi, değişken ismi, bir eşittir işareti ve değer kullanılır.
Herhangi bir deyim ya da fonksiyon içinde tanımlanmış yerel bir değişken, kapsamının dışında kullanılamaz.
Eğer aynı ismi taşıyan iki farklı değişkenlerden biri genel, biri yerel olarak tanımlanmışsa işler bir öncekine göre farklı olabilir.
Aşağıdaki iki değişken de yereldir. Her değişken kendi kapsamında oluşturulmuştur. Birinci değişkenin “Merhaba!” yazısına dönüşmemesinin nedeni, ikinci değişkenin kendi kapsamında yazılmasıdır. do end
deyiminde değişken, “Selam!” olmaktan çıkıp “Merhaba!” dizgisine dönüşmektedir.
Bir betikte her bir kapsam için kullanılabilecek en fazla yerel değişken sayısı 200’dür. 200’ü aşkın yerel değişkenler, betiği durdurur ve hataya sebep olur.
3) Tablo değişkeni
Her ne kadar bir değişken gibi görünmese de bunu göstermekte fayda var çünkü indis ve anahtarların sahip olduğu değerler de eşittir işaretiyle atanır.
Aşağıda birinci tablo indislerden, ikinci tablo anahtarlardan oluşmaktadır. Değerler bir eşittir işaretiyle oluşturulmuştur.
Deyimler (I)
Ön bilgi
Bu ve bir sonraki bölümün Deyimler olarak adlandırılmasının nedeni, İngilizcedeki
statement
veexpression
kelimelerinin Türkçe bilişim sözlüklerindeki karşılığınındeyim
olmasından kaynaklanmaktadır.Bu bölümde, anlamı “Ya bir bildirimi gösteren ya da yapılacak eylemlerin tanımını, (eğer varsa) bu eylemlerde yapılmasında kullanılacak işlenenleri ve sonuçların düzenlemesini içeren bir iş biriminin tarifini veren açıkça sonlandırılmış söz dizimsel birim.” olarak geçen
statement
sözcüğü ele alınmıştır.
Lua’da söz dizimi kuralı olarak deyimler bulunur. Deyimler, birçok işlevi yerine getirmemizi sağlar. Bu işlevler arasında koşullar, döngüler, atamalar vs. vardır.
1) Birim
Lua’da yazılan her bir kod yürütme parçacığı bir birim olarak geçer. Bu birimler, birinci satırdan başlayarak son satıra kadar sırasıyla gerçekleştirilir.
Her satır, her bir birime denk gelmeyebilir. Bir satırda birden fazla birime rastlanabilir.
Her bir birimin sonuna noktalı virgül “;” işareti getirilebilir fakat bu, birimin işlevini değiştirmez. Sadece bir istisna dışında, işaretin kullanılması tercih meselesidir.
Noktalı virgülün kullanılması zorunlu kılınan tek bir durum vardır: Eğer bir birim, fonksiyon çağırmaya meyilliyse ve parantez kullanımı başka bir satırda yapılmışsa bu, söz dizimi belirsizliğine sebep olur.
Yukarıda verilen kodun iki şekilde yorumlanması vardır:
-
a
değişkeni bir fonksiyondur ve bu fonksiyon çağırılmak isteniyor. - Son parantezler, isimsiz fonksiyona karşılık gelen bir birimin çağırıldığını ifade ediyor.
Bu karışıklığı gidermek için aşağıdaki gibi noktalı virgül kullanılır. Oluşturulan fonksiyonlardan birincisinin ismi “a
” iken ikinci fonksiyonun ismi yoktur. İsmi olmayan fonksiyonlara isimsiz fonksiyon denir.
Fonksiyonlar hakkında bilgi edinmek için “Deyimler (II)” bölümüne gidebilirsiniz.
2) Birim Blokları
İsminde var olduğu gibi, bir veya birkaç birimden oluşan bloklardır. Bu blokların kullanım faydalarından biri şudur: Değişkenler bölümünde bahsedildiği gibi kapsam sınırlayan değişkenlerin kullanılmasına olanak tanır. Aşağıda do end
ve if then end
kalıpları verilmiştir. Bunların içinde yazılan kodlar bir birim bloğunu oluşturur.
3) Atama
Bu kısım değişkenler için geçerlidir.
Lua’da bir veya birden fazla değişken aynı satırda tanımlanabilir.
Şekildeki gibi a
değişkeni 1 değerine sahiptir. b
, c
, e
değişkenleri ise değerlerin sıralandığı şekilde atanır. b
, 2; c
, 3; e
, 7 değerine sahip olur.
Başka bir özellik, değerlerin birbiriyle yer değiştirebilmesidir. Aşağıdaki iki kod parçacığı aynı işlevi üstlenmez. Birincisi, değerleri olduğu gibi değiştirir. İkincisi, önce birinci sonra ikinci değişkene değer atar. İkisi de farklı sonuçlar doğurur.
4) Kontrol akışı
4.1) while
Döngüsü
Bu döngüler, bir şart yerine getirildiği sürece devam eder. Bu şart, bir an olsun while
biriminde kontrol edildiğinde eğer şart sağlanmıyorsa döngüler durur. Aşağıdaki kod parçacığında a
değişkeni true
olduğu için döngünün bloğu sadece 1 kez yürütülür. Blokta a
değişkeni false
değeri atandığı için blok 2. kez yürütülememiştir.
4.2) repeat
Döngüsü
Bir önceki döngüye kıyasla neredeyse bir farkı yoktur. Tek farkı insan dili olarak bakıldığında bir şeyin gerçekleşmesine kadar blok yürütülmesi demektir.
4.3) for
Döngüsü
Bu döngüde gerçekleştirme miktarı programcıya bırakılmıştır. Ayrıca bu döngüde anlam bilimi çerçevesinde diğer döngülere kıyasla koşul yoktur, bu döngü bir yerden başlayıp bir şeyin sonuna kadar kullanılır. Elbette, önceden bahsedilen döngülerde de bu durum, programcıya mahsustur fakat bu döngüde daha açık bir şekilde yansıtılmıştır. Bu döngünün iki türü vardır: Sayısal ve genel.
Sayısal döngüde iki ya da üç değer kullanılabilir:
- Başlangıç değeri: Hangi sayıdan başlandığını gösteren değer
- Bitiriş değeri: Hangi sayıda bittiğini gösteren değer
- Artış değeri (tercihe bağlı): Her bir döngünün ardından kullanılan değişkenin artışı için kullanılan miktar
Döngüde başlangıç değeri olarak yazılan değerin her zaman bir ismi olmalıdır. Aksi hâlde söz dizimsel bozukluğa yol açar. Örneğin for i = 1, 3 do
yerine for 1, 3 do
yapılamaz.
Eğer i
değeri ile artış değeri toplandığında bitiriş değerini geçiyorsa döngü, blok yürütülmeden durdurulur.
Artış miktarı değerini de eklersek aşağıdaki görünüm elde edilir.
Artış miktarı hem pozitif hem negatif olabilir. Pozitif olursa başlangıç değeri giderek büyürken negatif olursa bu değer küçülerek gider.
Bu döngünün diğer bir kullanılış şekli ise genel for
döngüsüdür. Bu, in
sözcüğünün kullanımını da gerektirmektedir. Genel döngü, fonksiyonlarla (aynı zamanda iteratör) çalışır. Döngünün hangi biçimde gerçekleşeceği fonksiyonlarla belirtilir. Örneğin ipairs
fonksiyonu, bir tablodaki bütün indisleri, 1’den başlayarak birer birer artan bütün indisleri kullanır.
Döngünün başka bir özelliği daha vardır. Yukarıdaki ipairs
fonksiyonu yerine bambaşka bir fonksiyon da yaratılabilir. Örneğin, aşağıdaki kod parçası ilk 10 asal sayıyı yazdıran bir programdır.
Ne kadar uzun bir kod parçası gibi görünse de, ilk on asal sayıyı getiren program böyle yazılabilir. Genel for
döngüsünün kullanıldığı son kısım, asal sayıları asal
değişkenine atar ve böylece asal sayılar kullanılmış olur.
4.4) if
Koşulu
Doğruyu sağlayan bütün değerler, bu deyimin içindeki parçacığın yürütülmesini sağlar.
Koşul deyimlerinde (şart, kondisyon) if
ve then
sözcükleri kullanılır. Bu iki kelimenin arasına şart getirilir. Eğer bu şart sağlanırsa içindeki kodlar yürütülür, aksi hâlde if then
deyimi atlanır. Bir koşul deyiminde birden fazla karşılaştırma varsa karşılaştırmaya soldan başlanarak işlem öncelik sırasına dikkat edilir.
Karşılaştırma işleçlerine Deyimler (II) bölümünde göz atabilirsiniz.
Koşullar, and
, not
, or
kelimeleriyle de oluşturulabilir
-
and
: birinci karşılaştırma doğruysa sağdaki koşula bakar. Karşılaştırmalardan biri yanlış ise koşul yanlış sayılır. -
or
: birinci karşılaştırma doğruysa sağdaki koşula bakmadan koşulu doğru kabul eder. Aksi hâlde sağdaki koşula geçer. Sağdaki koşulların hepsi yanlış ise koşulun tamamı yanlış kabul edilir. -
not
: Koşulun doğruluğunu ters çevirir. Eğer bir koşul doğruysa yanlış, yanlış ise doğru olur.
Yukarıda and
ve or
kelimelerinin kullanıldığı kod parçalarının birinde karşılaştırmalar parantez içine alınmışken diğerinde alınmamıştır. Bu, betik yürütülmesinde herhangi bir sakınca çıkarmaz.
Bu durum İşlem Öncelik Sırası bölümünde anlatılmıştır.
Bir koşul sağlanmadıysa başka bir kod parçasının yürütülmesi de istenebilir. Bu yüzden else
gerekebilir.
Eğer bir koşul sağlanmadıysa ve diğer karşılaştırmalar sırasıyla yapılmak isteniyorsa elseif
sözcüğü devreye girer.
Koşulların hiçbiri sağlanmadıysa yine else
kullanılabilir. Bir if
deyiminde birden fazla elseif
bulunabilirken sadece bir tane else
sözcüğü olabilir.
4.5) Fonksiyon Çağırma
Fonksiyonlar, kod akışından farklı olarak hemen yürütülmezler. Bunun için belirli semboller kullanılır.
Fonksiyonları çağırmak için genellikle parantezler kullanılır fakat parantezlerin kullanılmadığı durumlar çok az görülür. Parantez kullanmadan fonksiyon çağırmak, söz dizimsel şekerdir.
4.6) break
ve return
Döngüyü belli bir yerde durdurmak için break
sözcüğü kullanılır. Aşağıdaki kodda 5’e kadar bütün doğal sayıların yazdırılması istenirken bitiriş değerinin 10 olduğu görülüyor. Bitiriş değerine ulaşılmadan blok, 5 sayısında durdurulmuştur.
return
kelimesi ise, bir kapsamın dâhilinde olan fonksiyonları durdurur ve argümanlar döndürür. Bu kelime, aşağıda kodun akışı durdurulacak şekilde yazılmıştır. Döngü 1 saniye boyunca çalıştıktan sonra return
tarafından durdurulacaktır.
Başka bir şekilde kullanılan return
kelimesi, burada ise fonksiyonu durdurup bir argüman döndürmüştür.
Deyimler (II)
Bu bölümde, anlamı “Bir ya da daha fazla işleneni sonucu olarak bir veri değerinin hesaplanmasını tanımlayan dil yapısı.” olan
expression
kelimesinden bahsedilmiştir.
1) Fonksiyon
Belli bir kod parçasının aynı betikte istenildiği zaman kullanılması için oluşturulan veri türleridir. Fonksiyon türleri üç tanedir: Genel, yerel ve isimsiz.
Genel ve yerel olarak oluşturulan fonksiyonlar, değişkenler tarafından tutulabilir fakat isimsiz fonksiyonlar, o anlık için yazılan fonksiyonlar olup bir isme sahip değildir. Bu yüzden isimsiz fonksiyonlar değişkenler tarafından kontrol edilemez.
Genel ve yerel kavramını Değişkenler bölümünde inceleyebilirsiniz.
İsimsiz fonksiyonlara örnek olarak şu gösterilebilir: Bir oyuncu katıldığında oyuncunun katıldığına dair bir fonksiyon çağırılır. Aşağıda görüldüğü üzere fonksiyonun ismi yoktur. Bu yüzden isimsiz fonksiyon olarak anılır.
İsimsiz fonksiyon oluşturmak için
local
kelimesine ihtiyaç kalmaz çünkü isimsiz fonksiyonlar daima içinde tanımlandığı kapsama aittir.
Sıra geldi söz dizimsel şekere. Fonksiyonların söz dizimsel şeker hâli asıl yazılışlarından daha çok kullanılır. Fonksiyonların asıl yazılışı aşağıdaki gibidir.
Birinci fonksiyon genel, ikinci fonksiyon yerel fonksiyonun asıl olarak yazılışıdır.
Aşağıda da bu fonksiyonların kısaca nasıl yazılabildikleri gösteriliyor.
Fonksiyonlarda parametre adında başka bir kavram daha vardır. Parametreler, fonksiyonda kullanılması gereken birtakım değerleri içeren değişkenlerdir.
Bu fonksiyonun belirli bir mesajı yazdırması isteniyorsa fonksiyon çağırıldığı zaman parametrelere getirilecek değerler sırasıyla yazılır. mesaj
kelimesi bir parametredir ve fonksiyon çağırıldığı anda bu parametre “Merhaba!” yazısına dönüşür. Böylelikle istenilen her mesaj, parametrelerle yazdırılabilir.
Bir fonksiyonda birden fazla parametre yazılabilir.
Parametreler yazılırken bazen parametre isimleri önemli olmayabilir. Bu parametre isimleri yerine üç nokta (…) işareti getirilerek bütün parametreler kapsanmış olur. Programlamada böyle oluşturulan fonksiyonlar, istenilen sayıda argüman kabul eden fonksiyonlar (variadic function) olarak geçer.
Üç nokta “…” ile gösterilen ifadeler, fonksiyona belirli bir sayıda geçirilmiş değerleri kapsar. Bu değerler üç nokta ile gösterildiğinde çoklu ilişki (
tuple
) oluşur. Çoklu ilişkiler, Lua’da herhangi bir veri türünü ifade etmez. Yapı itibarıyla tablolara benzerdir fakat aynı değildir. Örneğin; tablolardan, herhangi bir indis kullanılarak bir değer bulunabili. Çoklu ilişkilerde bu durum söz konusu değildir.Çoklu ilişkiler, tabloya dönüştürülürse bu durum çözülmüş olur. Demetteki her bir değer, tabloda belirli bir indise sahip olur.
İstenilen sayıda argüman kabul eden fonksiyonlarda “
...
” işareti, içinde kullanıldığı fonksiyona özgüdür. Eğer işaret, parametre olarak yazılmadıysa söz dizimsel bozukluk ile karşılaşılır.Aşağıda başka bir durum gösterilmiştir. Genel olarak oluşturulan bir fonksiyonun içinde yerel bir tane daha oluşturulmuştur. Genel fonksiyonun parametreleri “
...
” işareti ile kapsanmıştır. Bu işaret, sadece bu kapsamda kullanılabilirken yerel fonksiyonun kapsamı farklı olduğu için yerel fonksiyonun içinde kullanılması da söz dizimsel bozukluğa yol açar.Bunu düzeltmek için, genel fonksiyonda tanımlanan üç nokta işareti, yerel fonksiyonun parametre kısmına yazılır ve yerel fonksiyonun tanım kısmında başka bir üç nokta işareti yazılır.
Fonksiyonlar, aynı zamanda nesne yönelimli programlamada ve modüllerde kullanılır. Aşağıda bir modülden örnek verilmiştir. Bir tablo oluşturularak bu tablonun içine bir fonksiyon yüklenmiştir. Ardından bu fonksiyon, tablodaki karşılık gelen anahtar kullanılarak çağırılmıştır.
Bir tablodaki fonksiyonların kullanılması, içerdiği parametrelere bağlıdır. Bir fonksiyon eğer tabloda yer alıyorsa bu fonksiyonun birinci parametresi tablonun kendisi, diğer parametreleri fonksiyon çağırıldığında koyulan değerlerdir. Bunun sebebi, nesne yönelimli programlamayla ilişkilidir.
Burada self
kelimesi, tablo2
değişkeninin kendisidir çünkü yaz
fonksiyonu, nokta (.) kullanılarak oluşturulmuştur. mesaj
parametresi ise 123
sayısının kendisidir. Bu ifadenin söz dizimsel şekeri ise şu şekildedir:
Nokta yerine iki nokta (:) kullanılması, self
değişkeninin fonksiyon içinde kendi kendine tanımlanmasını sağlamıştır. Böylece tablonun kendisi için başka bir parametre yazılması önlenmiş olur.
2) Tablo
Tablo, değerlerin saklanabildiği bir veri türü olarak bilinir.
Tablo değerleri oluşturulurken her bir birim sonunda virgül ya da noktalı virgülden biri kullanılmalıdır. Aksi hâlde söz dizimsel bozukluğa yol açar.
Tablo oluşturmanın birkaç yolu vardır.
2.1) Sayısal indisli tablo
Bu tablo türleri, 1’den başlayarak birer birer artan indisli değerler içerir.
Lua’da indisler 1’den başlar.
Python
gibi diğer programlama dillerinde olduğu gibi 0’dan başlamadığı için karıştırılmamalıdır.Aşağıdaki kod parçasında, tablonun ne kadar indisinin sayma sayılarından oluştuğu “
#
” işareti ile bulunmuştur.
2.2) Anahtar bazlı tablo
Sayısal indisler dışında nil
veri türü hariç bütün türler anahtar olarak atanabilir.
2.3) Karışık tablo
Bu tablolarda sayısal indisler de olabilir anahtarlar da. Programlamanın daha ayrıntılı konularında yapılması önerilmez.
Bir Lua tablosunda en fazla 2147483647 değer yer alabilir. Her ne kadar bu limitin aşılması olanaksız görünse de bunu bilmekte fayda var.
3) İşleçler
3.1 Tek işlenenli işleçler
İşlemlerde sadece bir değer kullanılır.
İşleç |
Açıklama |
Yazılış |
Kullanım |
---|---|---|---|
Uzunluk |
Tabloların ve karakter dizgilerinin uzunluklarını ölçer |
#
|
#"Merhaba!" #{}
|
Eksi |
Önüne getirilen sayının işaretini değiştirir |
- |
-10 |
3.2 Çift işlenenli işleçler
İşlemlerde sadece iki değer kullanılır.
İşleç |
Açıklama |
Yazılış |
Kullanım |
---|---|---|---|
Artı |
İki sayıyı toplar. |
+
|
1 + 2 |
Eksi |
Soldaki sayıdan sağdaki sayıyı çıkarır. |
- |
12 - 10 |
Çarpı |
İki sayıyı çarpar. |
*
|
2 * 5 |
Bölü |
Soldaki sayıyı sağdaki sayıya böler. |
/ |
10 / 2 |
Modülüs (Modülo) |
Soldaki sayının sağdaki sayıya bölümüyle işlemdeki kalanı döndürür (modüler aritmetik). |
%
|
20 % 3 |
Üs |
Sağdaki sayıyı soldaki sayının üssü olarak alır. |
^ |
4 ^ 3 |
Eşittir |
İki değerin birbirine eşit olup olmadığını ölçer. Eşitse doğru döndürür. |
==
|
"2" == "2" |
Eşit değildir |
İki değerin birbirine eşit olup olmadığını ölçer. Eşit değilse doğru döndürür. |
~= |
false ~= nil |
Büyüktür |
Soldaki sayı sağdakinden büyükse doğru döndürür. |
>
|
6 > 4 |
Küçüktür |
Soldaki sayı sağdakinden küçükse doğru döndürür. |
< |
10 < 20 |
Büyük eşittir |
Soldaki sayı sağdakinden büyükse ya da sağdakine eşitse doğru döndürür. |
>= |
20 >= 20 |
Küçük eşittir |
Soldaki sayı sağdakinden küçükse ya da sağdakine eşitse doğru döndürür. |
<= |
15 <= 15 |
Ve |
İki koşul da doğruysa doğru, öbür türlü yanlış döndürür. |
and |
true and false |
Veya |
İki koşul da yanlışsa yanlış, öbür türlü doğru döndürür. |
or |
false or true |
Değil |
Bir koşulun geçerliliğini tersine çevirir. |
not |
not false |
Karakter dizgisi birleştirme |
İki dizgiyi birleştirir. |
.. |
"9" .. "8" |
Eksi “-” işareti iki türlü kullanılır. Birinci işlevi, bir sayının işaretini; işareti pozitif ise negatif, negatif ise pozitif yapmasıdır. Bunu bilgisayardaki karşılığı, işaret için 1 bit kullanılıp kullanılmaması durumudur. İkincisi ise verilen iki sayıdan soldaki sayıdan sağdakinin çıkarılma işlemidir.
3.3 Harici işleç
Tamamıyla işleç olarak kabul edemeyeceğimiz sembol grupları da var. Onlardan biri ise çift tire (⁃⁃) işaretidir. Bunun yazılmış olduğu satırlarda o işaretten satırın sonuna kadar bütün karakterler yorumlayıcı tarafından göz ardı edilir ve bu, kod akışına engel olmaz. Çift tire kullanılan satırlarda programcının o kod parçası hakkındaki yorumu söz konusudur.
Birkaç satırlık kod yorum olarak yazılmak isteniyorsa çift köşeli parantez ( [[ ]] ) kullanılır.
Eğer yorum içinde de köşeli parantez kullanılmak isteniyorsa eşittir işaretine ihtiyaç duyulabilir. İlk iki köşeli parantez ve son iki köşeli parantezin arasına istenilen eşit sayıda eşittir işareti konularak bu durum hâlledilir.
Şu anda Lua programlama dilinde söz dizimi kurallarının neredeyse tamamını öğrenmiş oldunuz. Sıra, işin mantıksal kısmına geldi.
İşlem Öncelik Sırası
Birden fazla işleç, aynı yerde kullanılabileceğinden işleçler için bir öncelik sırası belirlenmiştir. Lua’da bu işleçlerin öncelik sırası yukarıdan aşağıya doğru azalmaktadır. Bir öncekinden yukarıda olan işleçler, alttakine kıyasla işleme önce girmektedir.
Sıra |
İşleç |
---|---|
1 |
^ |
2 |
not # - |
3 |
* / % |
4 |
+ - |
5 |
.. |
6 |
< > <= >= ~= == |
7 |
and |
8 |
or |
2. sırada yer alan eksi işareti tek işlenenli, 4. sırada yer alan eksi işareti ise çift işlenenli işlemlerde geçerlidir.
Aşağıda birtakım işleçler aracılığı ile bir koşul oluşturulmuştur.
Bu kod parçasının anlamı şu şekildedir: 5’in 3’üncü kuvvetinin 12 katının 5 fazlası 1505 sayısına eşit ise ve 5 ile 10 sayılarının çarpımının 2’ye bölümü 50 değilse bu kod parçasını yürüt.
İşlem öncelik sırası kafa karışıklığı yaratıyorsa istenen işlemler parantez içine alınır. Parantez içine alınan işlemler, diğer işlemlerden daha önce gerçekleştirilir. Aşağıdaki kod parçası, yukarıdakinin parantezlerle ifade edilmiş biçimidir.
İstemli Tür Değişimi
Sayılar ve karakter dizgileri bazen karıştırılabiliyor. Örneğin sayı türünde olan bir değer ile bir dizgi olan fakat yine sayı içeren bir değerin toplanması mantıksız görünüyor fakat Lua’da işleçlerin taşıdığı anlama göre sayı ya da dizgi türleri değişebilir.
Örneğin, toplama işaretinde dizgi içeren bir değer varsa bu değer sayıya çevrilmeye çalışılır. Eğer dizginin içinde sayıdan farklı bir sembol ya da sayı oluşturma yollarında kullanılan sembollerin dışında başka bir sembol kullanılırsa aşağıdaki kod parçası hata verir. Sayılar her zaman sayı içereceğinden dizgi birleştirme işleci kullanıldığında daima string
türüne dönüşür.
Her
number
,string
türüne dönüşebilirken bu durumstring
türleri için geçerli olmayabilir.
Erişilmesi İmkansız Kod Parçası
return
sözcüğü kullanılırken dikkat edilmesi gereken hususlardan biri şu kod parçasında gösterilmiştir:
Yukarıda if then
deyimi her zaman true
ya da false
değerlerinden birini döndürecektir. Bu deyim mantıksal olarak o kapsam dâhilinde olan kod akışını durdurur ve akış, if then
deyiminin ötesine geçemez. Altı çizili olan satır da bu yüzden çizilmiştir ki asla yürütülemez. Bu yüzden bu durumlarda gereksiz satırlar silinmelidir.
Döngüyü Kısa Aralıklarla Askıya Alma
Döngüler betiğin önemli parçalarındandır. Çalıştıkları sürece içindeki kod bloğunu yürütürler. Döngüler kullanılırken dikkat edilmesi gereken konu, döngünün işlemciyi yormamasıdır çünkü döngüler çok hızlı bir şekilde çalıştıkları için bütün komutlar neredeyse aynı anda yerine getirilmeye çalışılır. Bu da cihazların yavaşlamasına sebep olabilir. Bunun için döngünün içine bir bekleme durumu konulmalıdır.
Aşağıdaki kod bloğunu kesinlikle denemeyiniz!
Bunun yerine, bekleme durumu olan bir döngü kullanılmalıdır. Aşağıda, kare hızına bağlı olarak çalışan bir kod parçası verilmiştir. Her bir kare, ekranda işlendiği zaman Merhaba! yazdırılacaktır.
İşinize yarayabilecek birkaç öneri:
-
Programınızı oluştururken öncelikle değişken oluşturma ile başlayın. Örneğin, betikte farklı kapsamlarda farklı işlevlerde kullanılabilecek değişkenler olabilir.
-
Olabildiğince yerel değişkenler kullanmayı benimseyin. Genel değişkenler genellikle tercih edilmezler.
-
Farklı deyim türlerine karşılık gelen ifadelerin arasına en az bir yeni satır karakteri ekleyebilirsiniz. Bu, ileri bir zamanda betiği okumanızda yardımcı olacaktır.
-
Her bir satıra sadece bir birim yazmaya özen gösterin. Örneğin, bir satırda birden fazla
print
fonksiyonu kullanmak yerine bunlar, yeni satırlara yazılabilir. -
Fonksiyon tanımlamada genellikle fonksiyonun söz dizimsel şeker hâli yazılır fakat fonksiyon çağırmanın söz dizimsel şekeri, programcılar tarafından arka plana atılır.
-
Noktalı virgül işaretini sadece gerektiği yerde kullanın. İşaretin kullanılmaması, betiğinizin çalışamaması anlamına gelmez. Birimler, Lua tarafından otomatik olarak algılanabilmektedir.
-
Şart deyimlerinde kondisyon sağlanırken doğruluk değerleri ve
nil
değeri, kelime olarak yazılmayabilir. Bunun nedeni, deyimdeki her bir şartın Lua’datrue
ya dafalse
değerlerinden birine eşit olmasıdır. Doğruluk değerleri venil
değeri, kesinkes karşılaştırılmak isteniyorsa yazılmalıdır.
-
Semboller, tek işlenenli işlemlerde kendinden sonra gelen karakterlere bitişik; çift işlenenli işlemlerde kendinden önce ve sonra gelen karakterlerden en az birer boşluk bırakılacak şekilde yazılabilir. Bu sayede, işleçlerin hangi görevde kullanıldığı bilinmiş olur.
-
Farklı kapsamlarda tanımlı değişkenler aynı işlevi görüyorsa bu değişkenler, bir üst kapsamda ortak değişkene alınabilir. İşlevleri farklıysa yine farklı kapsamlarda tanımlanmalıdır.
-
Yeni bir kapsama geçtiğinizde o kapsam için her birimde en az 2, en fazla 4 karakterlik boşluk bırakılması önerilir. Stüdyo, bunu varsayılan 4 karakterlik boşlukla yapar.
-
Betiğiniz çok karmaşıksa veya programcılar arasında iş birlikçi düzenleme yapılıyorsa, kod parçasının ne yaptığına dair yorumlar ekleyebilirsiniz. Gelecekte gerçekleştirmeyi düşündüğünüz bir konu varsa yorum kısmına “TODO” kelimesini ekleyebilirsiniz. Zaman içinde stüdyoda bu kelimeyi aratarak betiklerinizde yapmayı düşündüğünüz işlere göz atabilirsiniz.
- Betiğinizin çok fazla karakterden oluştuğunu düşünüyorsanız, performans açısından düşüş yaşadığınızı hissediyorsanız betiğinizi farklı betiklere ayırmayı düşünün.
Kapanış
Bu materyalde olabildiğince Türkçe kelimeler kullanılmaya çalışılıp Türkçemize uygun bir şekilde biçemiyle bir altyapı, içeriğiyle sağlam bir makale oluşturulmuştur. Bu sayede bu makale; Türk olan, Türkçe konuşan geliştiricilere rahatlıkla ulaşmış olur.
Okuduğunuz için teşekkürlerimi sunuyorum. Bütün emeğim, etkisini asırlar boyu sürdüren teknolojinin öğrenimi ve öğretiliş aşamasını ilerletmek üzerinedir. Umarım, anlattıklarım faydalı olmuştur.
İyi günler ve mutlu kodlamalar!