Özgür GÜL

Pony

Pony

Pony nedir? Kendi sitesinden alalım:

Pony is an object-oriented, actor-model, capabilities-secure programming language.

Yani, pony aktör tabanlı nesne yönelimli programlama dili diyebiliriz. Capabilities-secure’den kastı ise:

Pony programları, içinde olduğu klasörün adını alır. helloworld isimli bir klasör oluşturup main.pony isimli dosyayı oluşturalım. main.pony isimli dosya, pony programlarında gerekli.


actor Main
  new create(env: Env) =>
    env.out.print("merhaba dünya")
    

Üstteki satırları açıklayacak olursam, Main isimli aktör programın başlangıç noktası. new ise, klasik nesne yönelimli dillerdeki yapıcı (constructor) metodu görevinde. Farkı ise Pony dilinde constructor’lar isimlendiriliyor. Birden fazla constructor olduğu takdirde kodun okunabilirliğini arttırıyor.

env: Env isimli satırda, create isimli method Env objesini alıyor. Env objesi ile konsoldan girilen inputa erişilebilir.

Sınıflar

Pony’de bir sınıf oldukça kolay:

class Hayvan

Sınıfta field belirtebiliriz:

class Hayvan
  let isim: String
  var _ayak_sayisi: U64

Üstteki kod parçası, isim değişkeni String tipinde ve public. _ayak_sayisi ise integer (unsigned 64 bit integer) ve private. Pony’de değişken, fonksiyon veya davranışların başına _ konduğunda erişimi private olur. Önceden de dediğim gibi yapıcılar adlandırılır.

class Hayvan
  let isim: String
  var _ayak_sayisi: U64
  
  new create(isim': String) =>
    isim = isim'
    _ayak_sayisi = 2
    
  new ayakli(isim': String, _ayak_sayisi': U64 = 2) =>
    isim = isim'
    _ayak_sayisi = _ayak_sayisi'
  

Üst tarafta, bazı değişkenlerin sonunda gördüğünüz , kod yazarken oldukça kolaylık sağlıyor. Matematikten esinlenerek oluşturulmuş. Parametreler ve lokal değişkenlerde kullanılabiliyor.


let tavuk = Hayvan.create("tavuk")
let kirkayak = Hayvan.ayakli("kirkayak" ,10)

Sınıflar fonksiyona sahip olailir:

class Hayvan
  let isim: String
  var _ayak_sayisi: U64
  
  new create(isim': String) =>
    isim = isim'
    _ayak_sayisi = 2
    
  new ayakli(isim': String, _ayak_sayisi': U64 = 2) =>
    isim = isim'
    _ayak_sayisi = _ayak_sayisi'
    
  fun ayak_sayisi(): U64 => _ayak_sayisi

ayak_sayisi isimli fonksiyon U64 tipinde bir veri döndüreceğini söylüyor ve değişkeni döndürüyor. Pony’de fonksiyonlar’da return kullanılmazsa son satırdaki ifadeyi döndürür.

fun _final() fonksiyonu ise nesne, GC tarafından toplanmadan hemen önce çağrılı, o anki kullanılan kaynakları serbest bırakmada kullanılabilir.

Pony, inheritance yerine composition tercih ediyor, o yüzden javadaki gibi extends bulunmaz.

Aktör

Aktörler de tıpkı sınıflar gibi değişken, yapıcı ve fonksiyonlara sahiptir. Bunlara ek olarak aktörler davranışlara da sahiptir. fun ile tanımlanan fonksiyonlar senkron iken, davranışlan asenkrondur ve be ile tanımlanır:

actor Hayvan
  let isim: String
  var _ayak_sayisi: U64
  var _adimlar: U64 
  
  new create(isim': String) =>
    isim = isim'
    _ayak_sayisi = 2
    
  new ayakli(isim': String, _ayak_sayisi': U64 = 2) =>
    isim = isim'
    _ayak_sayisi = _ayak_sayisi'
    
  fun ayak_sayisi(): U64 => _ayak_sayisi
  
  be yuru() =>
     _adimlar = _adimlar + 1

Hayvan aktörüne yuru isimli davranışı ekledik. Davranışlar, asenkron olduğu için yuru() şeklinde çağrıldığında henüz bitmemiş olur ve dolayısı ile herhangi bir veri döndürmez, onun yerine alıcıyı döndürür.

Aktör-tabanlı programlama ilginenler için mutlaka göz atılması gereken bir dil. Pony’nin en belirgin diğer özellikleri şunlar: