モナドを知っている人も知らない人も沼にはめる魔法の言葉

Smalltalk「モナドなんて要らないよ。オブジェクトは全部再帰的な計算機だよ」
Self「クラスなんて要らないよ。オブジェクトは全部委譲されるよ」
Javascript「セミコロンなんて要らないよ。C構文だよ。Morphic標準装備!」

「ただ一言、その言葉を口にすればいい。ただそれだけだ」
「その言葉を、お前はもう知っている……」
「さあ言え、心の苦しみから解放される魔法の言葉を!」

「強い静的型付けなんかいらない」

メソッドと関数の違い

js> function P(x){ this.x=x }
js> class Q extends P { get x(){ return this.x } }
js> function R(x){ P.call(this, x) }
js> R.prototype = new P(0)
{ x: 0 }
js> R.prototype.x = function(){ return this.x }
function (){ return this.x }
js> varp0 = new P(1)
{ x: 1 }
js> var p0 = new P(1)
js> var p1 = new Q(2)
js> var p2 = new R(3)
js> Reflect.getOwnPropertyDescriptor(p0, "x")
{ value: 1, writable: true, enumerable: true, configurable: true }
js> Reflect.getOwnPropertyDescriptor(p1, "x")
js> Reflect.getOwnPropertyDescriptor(p2, "x")
{ value: 3, writable: true, enumerable: true, configurable: true }
js> p1.x
uncaught exception: InternalError: too much recursion
js> var p3 = {__proto__: new P(0), get x(){ return this.x; }}
js> Reflect.getOwnPropertyDescriptor(p3, "x")
{ get: get x(){ return this.x; }, set: (void 0), enumerable: true, configurable: true }
js> p3.x
uncaught exception: InternalError: too much recursion

Q.prototype.xの値がメソッド、R.prototype.xの値が関数です。MethodDeinitionはメソッドを定義します。関数ではありません。

仕組みは糞めんどくさいので仕様書読んでね!(・ω<)

その糞めんどくさいことを実現するためのClassDeclarationだよ!(・ω<)

classっていうけどclassなんてないよ。class constructorとprototypeプロパティに代入するオブジェクトを定義するだけだよ!(・ω<)

classじゃないのにclass constructorって言うけど仕様が馬鹿なんだよ!諦めてね!(・ω<)

propertyがあるのにinternal slotって言ったりslotなのにわざわざmethodって言ったり版を重ねる毎にひどくなるからどうしようもないよ!諦めてね!(・ω<)

仕様書と実装のソースコード見比べれば分かるけど実装に影響ない腐ってる仕様は無視するから影響ないよ!安心してね(・ω<)

実装に影響あってもガン無視するから影響ないよ!安心してね(・ω<)

js> class T extends P{}
js> T.prototype.x = function(){ return this.x }
function (){ return this.x }
js> var p4 = new T(4)
js> p4.x
4
js> Reflect.getOwnPropertyDescriptor(T.prototype, "x")
{ value: function (){ return this.x }, writable: true, enumerable: true, configurable: true }

こうすればいい。

rustは標準化前のC++から逃げそびれたeinherjarとJVMに疲れたeinherjarがValkyrjaに導かれたvalhallaである

「STL?ふざけんな!」
「標準化なにそれ?おいしいの??」

なぜjavaに逃げなかった!
逃げられなかった人はご愁傷様。

JVMに対してカリッカリにコード書いてる(VMのチューニングにあらず)最中に天井に鉛筆ぶん投げ始めたのを見られて「あなた疲れてるのよ」とか終いにはseason 10で「あなたちゃんと薬飲んでる?」とか言われた人。
rhinoのソースコード読んで、「読めるぞ!私にもhand optimizeが読める!」とか言い出す刻まで見えかけている人。
あんなSTWと戦い続けていた時代のロストテクノロジー、普通の人は理解する必要はありません。そっち方面の人は素直にGraalとTruffleに行けばいいと思うよ!

それでもVMと自分で戦い続けたい人、JITとGCに歯向かおうとする反乱者達よ、女王様の世界へようこそ!

ただし、以下の人には向きません。学習曲線が非常に高くなるでしょうし、JITがないので自分で最適化しなければなりません。

  • 所有権がわからない
  • scopeとextentの違いがわからない
  • (変数)束縛のmmutabllityとメモリのwritabilityの違いがわからない
  • java風に言うならコレクションの構造的変更とdata raceの関係がわからない
  • tracing GCよりmallocとfreeのペアのほうが速いと思っている

以下に該当する人は胃に穴が空くので注意しましょう。

  • ロクにi18n対応されてないと胃に穴が開く
  • コレクションがインターフェイスに対して設計されてないとキレそうになる
  • 「text encodingなにそれ?」にブチ切れる
  • 例外チェーンがなくてスタックトレースが細切れになるとFUKOのゲージがたまる
  • cargoがpure build toolじゃなくてBADエンドの未来に染まる
  • rustdocのバグに幾度となく阻まれ絶望する
  • Mutexとかありえない!

それを差し引いてもrustには以下のような利点があります。

  • 代数的データ型
  • reifiableなパラメトリック多相
  • リージョンによるメモリ管理
  • リージョンがあるのにかしこい型推論
  • 型システムで防ぐdata race
  • 変数がデフォルトでimmutable
  • ローカル変数のshadowingを許可
  • 健全なマクロ(ただしsymbolは名前空間に属さないので関数名などは衝突します)
  • FFI

つまり何がいいたいかというとValkyrjaいいよValkyrja! rustはいいぞ!