2014/09/27

Scala.js は出来が良いのかな?

なぞって練習 というミニゲームの ソースコード(ただし自作ライブラリ使用) を見てみると

Java と比較して

  • var で、変数宣言で型を毎回書かなくて良くなっている
  • いろんな所で () が省略できる
  • new も大体省略
  • セミコロンもけっこう省略できる
  • class じゃなくて object と書けばシングルトンが作れる
  • for .. yield でコレクションをかなり自由に操作できる
  • コレクションを高階関数で操作できる標準ライブラリが強力
  • public とか static とか void とか書かなくてよかったり {} が省略できてメソッド宣言が短い
  • プレースホルダ構文( x => x * 2 が _ * 2 と書ける)でラムダ式がさらに短く
  • class MyPoint(x:Double, y:Double) { .. みたく、型宣言とコンストラクタを1回で書ける
  • package object は open できるので import scala.scalajs.js.Math._ とすれば Math.pow を pow と書ける
  • Some(10) match { case Some(10) => 10 case None => 0 } パターンマッチで値を分解しつつ、値に応じて処理を分岐できる
  • F# のパイプライン演算子 |> や関数合成 >> などのコンビネータも、ユーザー定義演算子として自由に定義できる
  • new CanvasManipulator(canvas).draw(); のような型変換を伴う処理は、implicit conversion を使えば canvas.draw(); と書ける

という感じの事などが出来ていて Scala の言語機能で定型的なコードをどんどん削っていけます。
また、コーディングの自由度が高いので、可読性やメンテナンス性を良い状態に保ちやすい気がします。

その他の事情

  • コンパイル時間は多分長め
  • ミニマムな実行ファイルは 200kb 程度
  • サンプルは結構あるが、オープンソースで使われている例はまだ少ない
  • 重要なライブラリ出てきているが少ないので、既存のJavaScript資産との相互運用が必要
  • 定義にアノテーションを付ければ、JavaScript との相互運用が出来る
  • Scala がWebサービスのサーバーサイドで使われているので、クライアントサイドを Scala.js にすると、WebサービスをScalaで統一して書けるという事になる。

出来は良いと思いますが、ユーザーが増えるかどうかは予測できていません。

2014/09/19

ポリゴン模写

人体のポリゴンを作り始める(人体、ポーズ、手、顔、髪、服、キャラ絵、パース )
ツイートのURLに、ポリゴンと角度の情報を含める -> ツイートのリンクから、同じ条件で遊べるようにする

その他

ポリゴンの名前を表示
ポリゴンを選べるように

[DONE]一番長い線をヒントとして表示
[DONE]採点の詳細、いくつかの指標、描いた絵の特徴を言うようにする
[DONE]「クリア」「戻す」ボタン
[DONE]「ゲーム開始 or 説明を表示」を最初に出す
[DONE] パースを効かせた3D表示
[DONE] 線の角度が合っているか間違っているかで、加点・減点
[DONE] 経過時間をカウント

2014/09/01

F# の型推論

open System

// オーバーロードされたメソッドはどっかに型注釈が必要 -> Bad
let f x = Math.Abs x + x      

// 呼び出されるメソッドより後に型注釈を書いてもダメ -> Bad
let f x = Math.Abs x + (x:int)

// 先に型を決めておけば通る -> OK
let f (x:int) = Math.Abs x + x
let f x = (x:int) + Math.Abs x

// その場で型を決めても通る -> OK
let f x = Math.Abs (x:int) + x