Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Opa in 5 minutes

Opa in 5 minutes

Scratching surface of Opa http://opalang.org at #tenka1altJS Shibuya Japan, 2014 Jun 8th.

TATSUNO Yasuhiro

June 08, 2014
Tweet

More Decks by TATSUNO Yasuhiro

Other Decks in Programming

Transcript

  1. Power Rows: familiar {js:obj} on steroids 1of4 type point =

    {int x, int y} point p = {x:1, y:2} // 型は省略可 レコード(record)。 静的型付きフィールドからなる type option('a) = {none} or {some: 'a} option(string) girlfriend = {none} orでつないだいくつかの異なるレコードになりうる 直和型(sum type)。異形型(variant~)とも type boolean = {true} or {false} type size = {S} or {M} or {L} or {XL} フィールドのない単純な直和型はJavaなどでもお なじみの列挙型(enum type)っぽい type list('e) = {nil} or {'e hd, list('e) tl} 再帰的直和型(recursive sum type)で 隣接リストなんかも定義できる type open_example = {int a, …} フィールド追加できるオープンレコード type shape = {int w, int h} or {int r} ... 異形を追加できるオープン直和型
  2. Power Rows: familiar {js:obj} on steroids 2of4 person girl =

    {gname: "miku", fname: "hatsune", age: 16} lady1 = {girl with age: girl.age + 15} age = girl.age + 15 fname = "hachune" lady2 = {girl with ~age, ~fname} 既定では変更不能(immutable)。 ageフィールドを置換、それ以外は コピーした別インスタンスを作成 ~fieldはfield:filedの短縮形 フィールドをそのまま書く
  3. Power Rows: familiar {js:obj} on steroids 3of4 // レコードがあるパターンにマッチしたら値を取り出す girlfriend

    = {none} message = match(girlfriend) { case {none}: "彼女はいません。" case {some: name}: "彼女の名前は {name} です。" } Inserts(挿入) someフィールドの値を nameに束縛 matchは式(値を返す) ケースもれがあったらコンパイラがエラーを教えてくれる! この例は全パターン網羅してるので、エラーはない。
  4. Power Rows: familiar {js:obj} on steroids 4of4 // tuple。不均一コンテナ(heterogeneous container)

    jotaro = ("空条承太郎", 40, {male}) jolyne = ("空条徐倫", 19, {female}) // list。均一コンテナ(homogeneous container) family = [jotaro, jolyne] fail = [jotaro, jolyne, "ディオ"] // Type Error 実は糖衣構文で 実体はレコード
  5. Web Primitives: HTML, CSS & DOM r = 10 style

    = css { color: rgb(r, r*2, r*3); font-weight: bold; } msg = "Hello world" content = <div id=foo class="header header-rev"> <span style={style}>{msg}</span> </div> #main =+ content Insertも便利!! $("#main").prepend(content)相当
  6. One Language that Rules Frontend & Backend ...? Clojure? Dart?

    Haskell? Haxe? JavaScript? Kotlin? OCaml? PHP? Scala? <Language you prefer here>?
  7. Language-level DB support at ease type user = {int id,

    string name} database users { user /all[{id}] } user me = {id: 123, name:"mogami"} /users/all[{id: me.id}] <- me // 更新 me2 = /all[id = 123] // 読取 dbset(user, _) early_users = /users/all[id < 10] // 複数の抽出 idをキーとするuserの集合(set) DBセット型
  8. Ease of Getting Started 1. VirtualBox と Vagrant をインストール 2.

    Vagrant に opa.box を設定する 3. Opa VMを作成する 4. Opa VMを起動する 5. ホストPCとOpa VMを接続するため、Vagrantfileを編集する 6. Opa VMを再起動して、ターミナル接続する 7. アプリの基本構造となる足場(scaffolding)を作る 8. .opa ファイルをお好きなエディタで編集する 9. ビルドする 10. 開く cd /vagrant opa create tenka1altjs config.vm.network "private_network", ip: "192.168.xxx.xxx“ make run opa対応あり http://192.168.xxx.xxx:8080/ vagrant box add opa path/to/opa.box vagrant init OPA_VM_NAME vagrant up vagrant reload; vagrant ssh