Ponylangで型付きアクター生活[3] Expression編

注意 ここにある内容はpony2.x時代にドキュメントに書かれていた物なので、もう古い可能性が高いです。最新の情報は公式ドキュメントを参照してください。

はろぽにー ₍₍ (ง´・_・`)ว ⁾⁾

この挨拶流行るんですかね(´・_・`)

引き続きPonylangの紹介です。

公式ドキュメントではこのへんです -> http://tutorial.ponylang.org/expressions/variables/

こんかいは全部説明すると長いのでおもしろかったところを抜粋する形でお届けします。

Variable

var/letがあるのは前回までで紹介したとおりです。 特徴的なのは変数のshadowingがコンパイルエラーになるのと、グローバル変数がないことだと思いました。 shadowingがないのはvar x'のように'を活用すればよいとのことで、結構良さそうな感じです。

Infix Ops

演算子の優先順位を切り捨てたらしく、 1 + 2 * 3 すらコンパイルエラーになっています。必ず1 + (2 * 3)のように括弧をつけましょうとのことです。 たしかに演算子の優先順位はやっかいですが、どうなんでしょうか。ちょっと過激派な感じもします。

Ponyでは+<などは特定の名前の関数のaliasになっています。そのため、addltなどの関数を定義すると、 自動的に演算子が使えるようになります。具体的な対応表は以下を御覧ください。

http://tutorial.ponylang.org/expressions/infix-ops/

Methods

ざざっと飛ばします。オーバーロードがないことが印象的でした。 また、コンストラクタ名はまよったらcreateにすると良いらしいです。(その場合はFoo.create()を省略してFooとできるシンタックスシュガーがあります。)

Exceptions

エラーはerrorを使って呼び出します。

try
  callA()
  if not callB() then error end
  callC()
else
  callD()
then
  callE()
end

tryの中でエラーが起きたらelseの中が実行されます。 elseの中でエラーをハンドリングする必要は必ずしもないようで、何もしなかったらそのままelseが実行された後、処理が続行されるようです。thenはJavaのfinally相当なものです。

ただし、errorが出る部分は必ずtryで包む必要があります。これはコンパイル時にチェックされます。

また、errorを使ってPartial Functionを表現できます。PonyではPartial Functionには?を結果型の次に付ける必要があります。

fun factorial(x: I32): I32 ? =>
  if x < 0 then error end
  if x == 0 then
    1
  else
    x * factorial(x - 1)
  end

Object Literal

無名クラスのようなことはobjectキーワードで表現できます。

object is Hashable
  fun apply(): String => "hi"
  fun hash(): U64 => this().hash()
end

Lambda

ラムダ式もあります。

lambda(s: String): String => "lambda: " + s end

Partial application

部分適用は

let f = foo~addmul(3)
f(4)

のようにfoo.addmul(3, 4)の代わりに~で呼び出してやればOKです。 Ponyでは名前付き引数が使えるので順番が最初でない引数を適用することも出来ます。

まとめ

ということで今回は雑に駆け巡りましたが次回はいよいよcapabilitiesの節なので期待しています₍₍ (ง´・_・`)ว ⁾⁾