2014年5月18日日曜日

ラムダ式について

#コメントを頂きましたので、加筆・修正しました。


Dart は「ラムダ式」を使用することができます。
ラムダ式は言語ごとに、またはその文献ごとに説明が異なっていることがあります。


具体的には、
・匿名関数そのものを指す
・匿名関数を短くコーディングできる手法を指す
 (”=>”をラムダ演算子と呼ぶ言語もある)
・第1級オブジェクトとして扱える関数を指す
などです。


「Dart はラムダ式が使える」とよく聞きますが、それらは上記のようなものを総称して言っているのだと思います。
(筆者が勝手に思っています)


まずは関数のショートハンドですが、
// 引数 a に b を足して返すだけ
addingA2B(a, b) {
  return a + b;
}
これは、
addingA2B(a, b) => a + b;
と書けます。


また、関数をオブジェクトとして扱える点については、
var addingA2B = (a, b) => a + b;

// こちらも同意
var addingA2B = (a, b) { return a + b; };
といった感じです。


ラムダ式を用いることでクロージャを実現することも可能です。
#今回は触れませんが。。。


今回あえて引数に型指定を行いませんでしたが、上記関数にオペレータオーバーロードした値を渡してもちゃんと計算してくれました。
かしこい!(って当たり前か。。。)


因みに、、、
Java8 のラムダ式はこれとは意味合いが少し異なっていて、関数型インターフェースを実装する形になります。
(抽象メソッドがない場合や、複数ある場合はどのメソッドを実装してよいか判断できないのでコンパイルエラーになる)
Dart とは全く関係ないですが、最近よく見かけるので比較してみました。


今回はこんなところです。

2014年4月13日日曜日

Pub とは

Dart には「pub」と呼ばれるパッケージ管理機能があります。
この pub を使用することで、Dart パッケージに存在するライブラリを使用することができます。


具体的には
- pubspec (依存関係やその他のメタデータを追加するためのファイル)を設定し
- pub を用いてパッケージの依存関係を取得し
- ライブラリをインポート
といった形です。


リファレンスページでは pub コマンドを用いた事細かな情報が書かれていますが、そもそも DartEditor に pub を使用するためのサポートが用意されているので、ここでは簡単な概要のみ説明します。


ライブラリのインポートについて、 dart ファイル上では次のように記載します。
import 'iq150problem.dart';
このファイルは同一ディレクトリ内の「iq150problem.dart」をインポートしています。


では、ディレクトリ構成が次のようになっていたらどうでしょう?
※インポート宣言するのは main.dart
iq150problem/
    lib/
        iq150problem.dart
    web/
        main/
            main.dart
この場合は次のようにインポートしないといけません。
import '../../lib/iq150problem.dart';
このような相対パスを用いた方法だと、インポートするファイルの配置が変わった場合などにコードを修正する必要が出て面倒です(汗)。


上記のような脆弱性や手間を省くために使われるのが pub です。
pub を用いると次のようにインポートすることができます。
import 'package:iq150problem/iq150problem.dart';
pub により、アプリと iq150problem パッケージに依存関係を持たせることで、パッケージ内ならどこに配置しても同じ記述でインポート可能になります。
便利ですね!


今回は pub の超概要のみですが、アプリの規模が大きくなるほど有益な機能であると筆者は考えます。
(あとは、テストコードを書くときとか便利かな~)


pub の設定(今回でいう依存関係を持たせるための設定)などを行うためのファイル「pubspec.yaml」についてまったく触れてないですが、これは機会があればということで。。。

2014年2月21日金曜日

【Dart でやってみた】これが解けたら IQ150 の問題

以前 Twitter で話題になったツイートで、次のようなものがあります。
解けたら IQ150 以上の問題

6 + 4 = 210
9 + 2 = 711
8 + 5 = 313
5 + 2 = 37

7 + 6 = ??


解けたら本当に IQ150 以上かどうかはさておき、これは「+」の実装を変えたら実現できるわけです。
つまり演算子オーバーロード(オペレータオーバーロード)です。


演算子オーバーロードとは上記問題のように、演算子の実装を変えることができる機能です。
Dart にもこの機能が用意されていますので、今回はこの IQ150 の問題を Dart で実現してみます。


まずは演算子オーバーロードのためのクラス。
class Iq150Problem {
  
  int x;
  Iq150Problem(this.x);
  
  operator + (Iq150Problem iq150) {
    
    int i1 = this.x - iq150.x;
    int i2 = this.x + iq150.x;
    
    return i1.toString() + i2.toString();
  }
}


演算子オーバーロードした「+」を実際に使用すると次のようになります。
import 'iq150problem.dart';

void main() {
  
  Iq150Problem iq1 = new Iq150Problem(7);
  Iq150Problem iq2 = new Iq150Problem(6);
  
  print(iq1 + iq2);
}


実行結果は 113 です。


この blog 初の技術的な内容でした。
今後は興味深い機能を見つけたら【Dart でやってみた】として書いていきたいと思います。

2014年2月2日日曜日

Dart SDK 1.1

2013年の11月に Dart SDK 1.0 が公開されたばかりですが、
2014年1月16日に SDK 1.1 が公開されました。


1点目の変更点は、JavaScript への出力関連の速度向上です。
JavaScript へのコンパイルに関しては、プレリリースのころから、色々と言われてきましたので、かなり力を入れているのだと思います。
現時点では JavaScript と同等な実行速度であると発信されています。


2点目の変更点は、サーバーサイドでの開発環境の強化です。
今回のバージョンアップでサーバー周りの拡張機能が多く追加されています。
また、開発環境となる DartEditor に関しても、多くの機能が追加されたようで、開発時の生産性が向上しているようです。
#これらはまだ未検証なので、また試した後に追記します。。。


昨年末から SDK のバージョンアップが頻繁に行われるようになり、ついていくのがやっとな状態ですが、できる限りタイムリーに情報を伝えられるようにしていきます。

2014年1月9日木曜日

Error: Could not find 'main'.

以前 blog の中で紹介した JavaScript へのコンパイルを行うための dart2js 。
#以前の記事はこちら


これを使用した場合に少々厄介なエラーに遭遇することがあります。
それが今回の記事のタイトルにした「Error: Could not find 'main'.」というエラーです。


実際に DartEditor のコンソール上に表示されるのは次の通り。
--- 2014/01/07 23:54:02 Running dart2js... ---
C:\Program Files\darteditor-windows-ia32\dart\dart-sdk\bin\dart2js.bat --out=D:\dart\pop-pop-win\web\platform_web.dart.js D:\dart\pop-pop-win\web\platform_web.dart
/D:/dart/pop-pop-win/web/platform_web.dart:1:1: Error: Could not find 'main'.
library ppw_platform_web;

Error: Compilation failed.
※ pop-pop-win はアプリ名


ログを見ただけでピンと来る人もいるかもしれませんが、
これは sdk が配置されている場所が関係します。


「Program Files」ですね。
フォルダ名に半角スペースが含まれているため、ライブラリを認識できずエラーとなっています。
このエラーを回避するためには、インストールの際に sdk の配置先を気を付ければ大丈夫です。


筆者はこのエラーの解消にざっと4時間かかりました。。。
ググっても全然出てこないものorz

2013年12月27日金曜日

Android × Dart = ???

今回は Android と Dart のコラボレーションの話題です。


Android とは、Google が開発した(厳密には違いますが)スマートフォン向けの OS です。
スマートフォンの普及の立役者で、今や知らない人はいないですね。


筆者は過去に Android アプリを Dart で実装できないかと、いろいろと調べた事がありました。
その時期は Dart 自体も安定版ではありませんでしたし、Android 上で Dart を動かす術は見つかりませんでした。


それがつい先日、Android のデバイス上で Dart VM をビルドして実行可能になったそうです。(参考はこちら
現在は実験段階ということで、ビルドできる環境がLinuxであったり、コマンドラインからの実行のみしかできないなどの制約はあるようですが。。。


筆者の環境は Windows ですので、実際に Android 上で Dart を動かすのは先になりますが、非常に楽しみな話題ですので、今後も動きがあればレポートしていきたいと思います。

2013年12月24日火曜日

Dart SDK バージョン UP について

前回の Blog で、Dart SDK のインストール方法について書きましたが、今回は、すでに Dart Editor インストール済みの環境の場合のバージョン UP 方法について書きます。
Dart は現在も進化しているプログラミング言語ですので、今後も頻繁にアップデートがあると考えられるだけに、必須の対応となるはずです。


Dart Editor を起動し、上部の「Help」タブをクリックし、「About Dart Editor」をクリックします。




立ち上がった別ウインドウの右下部の「Applay Update...」をクリックします。



アップデート処理が実行され、次の画面が表示されたら SDK のバージョン UP は完了です。
※右下部のボタン「Check for Update」が選択不可の状態



なお、アップロードするデータのダウンロードがされてない場合は以下のウインドウが立ち上がりますが、アップロードのとき同様に、下部の「Download Update...」ボタンをクリックすれば OK です。



Dart Editor を使ったバージョン UP ができるので、簡単ですね!
今回は以上です。