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
expression2Verse 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
expression3if-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
expression4if-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
expression2test-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).