Pony
Erlang と Rust の要素を持つと耳にした
公式
特徴
reference capability
型修飾子で表現
6種類ある
object oriented
継承は無い
メッセージパッシングという意味のオブジェクト指向?
LLVMバックエンド
メモリ管理はGC
Distributed Pony
複数ノードの上で分散するためのものらしい
長い論文なので読めてない
Getting Started
Ponyの哲学
the-right-thing でもなく、worse-is-betterでもなく、get-stuff-done
Types
Classes
varは何度も代入可能
letはコンストラクタでのみ代入可能
embedは後述
newキーワードでコンストラクタをいくつでも作れる
privateなフィールドは名前が_から始まる
hoge''のような変数名がOK
数学から来てる
FunctionはJavaとかのメソッドと似たような感じ
reference capability
ここではfunのあとに参照型を示すrefを付ける
その関数を呼び出されるオブジェクトはmutableでなければならない
代入は代入された変数の古い値を返す
destructive read
_finalがfinaliser
GCに回収される前に呼び出される
継承は?
ない
traitとinterfaceがある
Primitive
Classに似ている
Primitiveはフィールドを持たない
ユーザ定義Primitiveはインスタンスがただ1つだけ
他の言語のモジュールに近いような考え方な気がする
BuiltinはBool, ISize, ILongとかとか
_init, _finalがある
Cライブラリの初期化と終了で便利
Actors
actorはclassに似ているがbehaviourを持つ
behaviourは
receiver capabilityを持たない
常にNoneを返す
Concurrent
自前のスケジューラがあり、標準でCPUのコア数と同じ数のスレッドを起動する
それぞれのスレッドがactorのbehaviourを実行する
Capabilities secure type systemのおかげで並列?平行?安全になっている
Actors are cheap
オブジェクトとは対象的に、アクターだけのにかかるコストは256バイトのメモリだけ
Traits and Interfaces
Subtyping (派生型) には通常nominalとstructuralがある
Ponyは両方持つ
nominal subtypingはtrait
Rustのtraitに近い
structural subtypingはinterface
大体traitと同じ
インターフェースを満たしていれば自動でsubtyping扱いされる
迷ったらより柔軟なinterfaceを使え
でも、traitはaccidental subtypingを防げて便利
Structs
classに似てるけどFFIのためのもの
普通にPonyを書いてたら大体はclassを使う
Type Aliases
interface/trait を持たなければならない、という制約も書ける
generic type は [A]
Type Expressions
代数的データ型のことで、タプル、直和型、直積型がある
(String, U64)
Expressions
Literals
asで配列の要素を型強制する
Partial function
?マーク付きで呼ぶ
Variables
ローカル変数
ブロック、ではなく、チャンク、と書いてある
チャンクがscopeになる
フィールド
embedでそのクラスのメモリ領域に埋め込まれる
グローバル変数は無い
Operators
大体のinfix演算子は関数へのエイリアス
xxx_partialが謎
Arithmetic
x / 0 = 0になる
default算術、unsafe算術、partial算術、checked算術の4つがある
大体はdefaultを使っておけばいい
Control Structures
Everything is an expression
statementはPonyには無い
forに elseが書ける
code:pony
var x: (String | None) =
for name in ArrayString.values() do name
else
"no names!"
end
whileにも同じように書ける
ネストしたbreakは対応してない
Methods
グローバル関数というものはない
コンストラクタは生成したオブジェクトでの呼び出せる
ポリモーフィズムで便利そう
var a: Foo = a.create() というのもいける
名前付き引数
let e = Foo.create2(where y = 4, x = 3)
名前付き引数と引数位置での組み合わせもできる
e.f(6, 7 where d = 8)
メソッドチェーンは.>
無名メソッド (ラムダ)
Errors
tryのelse節は書かなくてもいい
無視される
partial function
errorを発生させるが、tryするのはその関数を呼び出す側
?を返り値型と呼び出すときにかかなければならない
クラスのコンストラクタもpartialに出来る
非同期で実行されるのでactorのコンストラクタとbehaviourはできない
エラーはコンパイル時に検査され、tryを必ずしなければいけない
withで作ってオブジェクトは抜けるときに破棄される
asコマンドが例外を投げうるらしい
他の言語との差
Ponyのエラーはエラーに紐づく型やインスタンスを持たない
プログラマのするべきエラーハンドリングが簡単になり、実行時のエラーハンドリングの性能がよくなるから
Equality
Identity equelity(is)とStructural equality(==)がある
オブジェクトが同じか、同じデータを保持するかの違い
eqメソッドを実装しなかった場合はデフォルト実装内でisが使用される
Suger
糖衣構文について
=をオーバーロードした引数付きが少し不思議な感じ
Object literals
参考