if
ifadesiyle programın akışını değiştiren kararlar verebilirsin. Diğer programlama dillerinde olduğu gibi Verse if
ifadesi de koşullu yürütmeyi destekler ancak Verse’te koşullar kararı yönlendirmek için başarı ve başarısızlığı kullanır.
Örneğin, bir oyuncunun hasar almadan önce inebileceği düşüş yüksekliğini tanımlayan kodu yazabilirsin.
var PlayerFallHeight : float = CalculatePlayerFallHeight()
# Players take damage if they fall more than 3 meters
if (PlayerFallHeight > 3.0):
DealDamage()
# Reset the player’s fall height
ZeroPlayerFallHeight()
Bu örnekte, PlayerFallHeight
üç metreden yüksekse koşul başarılı olur ve oyuncunun düşme yüksekliği sıfırlanmadan önce DealDamage()
yürütülür. Bu değer üç metreden küçükse koşul başarısız olur, bu nedenle kullanıcı herhangi bir hasar almaz ancak oyuncunun düşüş yüksekliği sıfırlanır.
if
Oyuncu düşüş yüksekliği örneğinde aşağıdaki sözdizimi kullanılacaktır:
expression0
if (test-arg-block):
expression1
expression2
Verse programı expression0
ifadesini yürüttükten sonra if blokuna girer. test-arg-block
başarılı olursa Verse programı expression1
ifadesini yürütür. Bu tek bir ifade veya bir ifade bloku olabilir. Tersine, test-arg-block
başarısız olursa Verse programı expression1
ifadesini atlar ve yalnızca expression2
ifadesini yürütür.
if-block mantığı akış diyagramı.
if ... else
if
ifadesi başarısız olduğunda yürütülecek bir ifade de belirtebilirsin.
Örneğin, oyuncu üç metreden daha az düşerse ve zıplama ölçer yüzde 100’e ulaştıysa çift zıplama becerisi kazanmalıdır. Ancak üç metreden daha yüksekten düşerse veya zıplama ölçer yüzde 100’e ulaşmadıysa oyuncuya çift zıplayamayacağını bildirmek üzere karakterin kolları çırpılacaktır.
var PlayerFallHeight : float = CalculatePlayerFallHeight()
if (PlayerFallHeight < 3.0 and JumpMeter = 100):
# Perform a double jump.
ActivateDoubleJump()
# Reset the player’s fall height.
ZeroPlayerFallHeight()
else:
# Flap the character’s arms to tell the player they
# cannot double jump right now!
Bu örnekte if
koşulu, PlayerFallHeight
değerinin üç metreden daha az ve JumpMeter
değerinin yüzde 100’e eşit olup olmadığını değerlendirir. Koşul başarılı olursa SetDoubleJumpCooldown()
ifadesinden önce ActivateDoubleJump()
ve ZeroPlayerFallHeight()
ifadesi yürütülür.
if
koşulu başarısız olursa SetDoubleJumpCooldown()
ifadesinden önce, else
ifadesini izleyen ActivateFlapArmsAnimation()
ifadesi yürütülür.
Sözdizimsel olarak, if-else örneği şu şekilde görünür:
expression0
if (test-arg-block):
expression1
else:
expression2
expression3
if-else-block mantığı akış diyagramı.
if ... else if ... else
Bir oyuncunun yüzde 100 kalkanı varsa üç metreden daha yüksekten düştüğünde maksimum hasarı alır ancak yine de hayatta kalır. Şimdi oyuncuya çift zıplama becerisi veren kuralı, oyuncular yalnızca üç metreden daha az düşerse ve zıplama ölçer yüzde 75’ten daha yüksekse çift zıplama becerisi kazanacak şekilde değiştirelim.
var PlayerFallHeight : float = CalculatePlayerFallHeight()
if (PlayerFallHeight > 3.0 and shields = 100):
DealMaximalDamage()
return false
else if (PlayerFallHeight < 3.0 and JumpMeter > 75):
ActivateDoubleJump()
return false
else:
return true
Sözdizimsel olarak, if-else if-else örneği şu şekilde görünür:
expression0
if (test-arg-block0):
expression1
else if (test-arg-block1):
expression2
else:
expression3
expression4
if-else if-else-block mantığı akış diyagramı.
if ... then
Önceki örneklerde gördüğün if
koşullarından herhangi birini, işleyişlerini değiştirmeden birden fazla satıra yazabilirsin:
expression0
if:
test-arg-block
then:
expression1
expression2
test-arg-block
kod bloku bir veya daha çok koşul satırı içerebilir ancak expression2
ifadesinden önce expression1
ifadesini yürütebilmek için hepsinin başarılı olması gerekir. Aksi takdirde yalnızca expression2
ifadesi yürütülür.
if ... else kısmındaki örneğin bu formatta yeniden yazılmış hali şu şekilde görünür:
var PlayerFallHeight : float = CalculatePlayerFallHeight()
if:
PlayerFallHeight < 3.0
JumpMeter = 100
then:
# Perform a double jump.
ActivateDoubleJump()
# Reset the player’s fall height.
ZeroPlayerFallHeight()
Tek Satırlı İfade
if else
koşulunu, diğer programlama dillerindeki üçlü işleçlere benzer şekilde bir tek satırlı ifade olarak yazabilirsin. Örneğin, bir oyuncunun ShieldLevel
seviyesine göre maksimum veya minimum bir Recharge
değeri atamak istersen aşağıdaki Verse kodunu yazabilirsin:
Recharge : int = if(ShieldLevel < 50) then GetMaxRecharge() else GetMinRecharge()
Koşul Gereksinimleri
Parantez () içindeki ifade olan if
ifadesinin koşulu, bir Boole (Verse’te logic
(mantık) adı verilir) döndürmesi beklenmediği için diğer programlama dillerinden farklıdır. Bunun yerine, koşulun decides
efektine sahip olması beklenir (alt tür oluşturma normalde bir efekt kümesine izin veren yerlerde efekt alt kümesi oluşturmaya olanak tanırken, if ifadesinin koşulun genel efektinin decides
efektini içermesini gerektirdiği unutulmamalıdır). Efekt, çevreleyen kapsamdan kaldırılır. Diğer bir deyişle, if
koşulundaki tüm işlemlerde bulunan decides
efekti, if
yapısı tarafından kullanılır. Örneğin, aşağıdaki kodda Main
, decides
efektine sahip olmasa da çağırdığı Foo
bu efekte sahiptir.
Foo()<transacts><decides> : void = {}
Bar() : void = {}
Main() : void =
if (Foo[]):
Bar()
Bunun nedeni, hangi dalın alınacağını seçmek için if
ifadesinde bir logic
girdisi kullanmak yerine, uygun dala karar vermek için if
koşulunda yer alan işlemlerin başarısının kullanılmasıdır. Tüm işlemler başarılı olursa then
dalı, işlemlerden herhangi biri başarısız olursa else
dalı (varsa) kullanılır. Bu durum, sabitler tanımlamak da dahil olmak üzere if
koşulunda isteğe bağlı işlemlerin kullanılabileceği anlamına gelir. Örneğin:
Main(X : int) : void =
Y = array{1, 2, 3}
if:
Z0 := Y[X]
Z1 := Y[X + 1]
then:
Use(Z0)
Use(Z1)
Başka bir ifadeyle, then
dalının kapsamı, if
koşulunda tanımlanan tüm adları içerir.
İşlem Davranışı
if
ifadesinin diğer programlama dillerinden bir diğer farkı, if
koşulunun işlem davranışıdır. if
koşulu no_rollback
efektine (transacts
, varies
veya computes
efektlerini açıkça belirtmeyen tüm fonksiyonlar tarafından örtük olarak kullanılır) sahip olmamalıdır. Bunun nedeni, koşulun başarısız olması durumunda koşulun yürütülmesi sırasında gerçekleştirilen tüm işlemlerin (çalışma zamanı dışındaki kaynakları etkileyen dosya G/Ç veya konsola yazma gibi işlemler haricinde), else
dalı yürütülmeden önce geri alınmasıdır. Örneğin:
int_ref := class:
var Contents : int
Incr(X : int_ref)<transacts> : void =
set X.Contents += 1
Foo(X : int) : int =
Y := int_ref{Contents := 0}
if:
Incr(Y)
Foo(-1)
fonksiyonu 0
, Foo(1)
fonksiyonu ise 1
değerini döndürür. Bunun nedeni, Incr
çağrısı X > 0
testinden önce gerçekleşse de sebep olduğu Y
değişikliğinin else
dalı yürütülmeden önce geri alınmasıdır. Incr
ifadesinin transacts
efektini manuel olarak belirtmek zorunda olduğu unutulmamalıdır. Varsayılan olarak, işlem davranışı belirtilmez ve örtük no_rollback
efekti ile gösterilir ancak transacts
efekti manuel olarak belirtilerek eklenebilir (örtük no_rollback
efektini geçersiz kılar).