Dart で Hello World

## Dart を Homebrew で macOS にインストールする

Homebrew を使って Dart をインストールする。
インストール方法は Dart 公式ドキュメントの [Get the Dart SDK \| Dart](https://dart.dev/get-dart) を参考にした。

```
$ brew tap dart-lang/dart
$ brew install dart
```

```
$ which dart
/usr/local/bin/dart

$ dart --version
Dart VM version: 2.7.0 (Fri Dec 6 16:26:51 2019 +0100) on "macos_x64"
```

## Hello World

以下の内容の hello.dart というファイルを用意する。

```hello.dart
void main() {
  print('Hello, World!');
}
```

dart コマンドで実行する。

```
$ dart hello.dart
Hello, World!
```

参考:

- [dart \| Dart](https://dart.dev/tools/dart-vm)
- [Language samples \| Dart](https://dart.dev/samples)

## ネイティブの実行ファイルを生成する

dart2native コマンドでスタンドアローンの実行ファイルを生成することができる。

```
$ dart2native hello.dart -o hello
Generated: /Users/alice/hello
```

生成された実行ファイルは単体で実行することが可能。

```
$ ./hello 
Hello, World!
```

ドキュメントによると、書いたプログラム自体のネイティブコードだけでなく、型チェックとガベージコレクションの処理をする Dart ランタイムが含まれているとのこと。

[dart2native \| Dart](https://dart.dev/tools/dart2native)

> A standalone executable is native machine code that’s compiled from the specified Dart file and its dependencies, plus a small Dart runtime that handles type checking and garbage collection.

## 各種処理

ソースコードは [Dart programming language \| Dart](https://dart.dev/) トップページで提示されているものを使用した。

### 関数を使う

以下の内容の functions.dart というファイルを用意する。

```functions.dart 
// A function declaration.
int timesTwo(int x) {
  return x * 2;
}

// Arrow syntax is shorthand for `{ return expr; }`.
int timesFour(int x) => timesTwo(timesTwo(x));

// Functions are objects.
int runTwice(int x, Function f) {
  for (var i = 0; i < 2; i++) {
    x = f(x);
  }
  return x;
}

main() {
  print("4 times two is ${timesTwo(4)}");
  print("4 times four is ${timesFour(4)}");
  print("2 x 2 x 2 is ${runTwice(2, timesTwo)}");
}
```

実行結果。

```
$ dart functions.dart 
4 times two is 8
4 times four is 16
2 x 2 x 2 is 8
```

### if else 文とループ処理

```if-and-loop.dart
bool isEven(int x) {
  // An if-else statement.
  if (x % 2 == 0) {
    return true;
  } else {
    return false;
  }
}

List<int> getEvenNumbers(Iterable<int> numbers) {
  var evenNumbers = <int>[];

  // A for-in loop.
  for (var i in numbers) {
    // A single-line if statement.
    if (isEven(i)) evenNumbers.add(i);
  }

  return evenNumbers;
}

main() {
  var numbers = List.generate(10, (i) => i);
  print(getEvenNumbers(numbers));
}
```

実行結果。

```
$ dart if-and-loop.dart 
[0, 2, 4, 6, 8]
```

### 配列、連想配列、集合

```collection.dart
// A list literal.
var lostNumbers = [4, 8, 15, 16, 23, 42];

// A map literal.
var nobleGases = {
  'He': 'Helium',
  'Ne': 'Neon',
  'Ar': 'Argon',
};

// A set literal.
var frogs = {
  'Tree',
  'Poison dart',
  'Glass',
};

main() {
  print(lostNumbers.last);
  print(nobleGases['Ne']);
  print(frogs.difference({'Poison dart'}));
}
```

実行結果。

```
$ dart collection.dart 
42
Neon
{Tree, Glass}
```

参考:

- [List class \- dart:core library \- Dart API](https://api.dartlang.org/stable/2.7.0/dart-core/List-class.html)
- [Map class \- dart:core library \- Dart API](https://api.dartlang.org/stable/2.7.0/dart-core/Map-class.html)
- [Set class \- dart:core library \- Dart API](https://api.dartlang.org/stable/2.7.0/dart-core/Set-class.html)

### クラス

```classes.dart 
// Abstract classes can't be instantiated.
abstract class Item {
  use();
}

// Classes can implement other classes.
class Chest<T> implements Item {
  List<T> contents;

  // Constructors can assign arguments to instance variables using `this`.
  Chest(this.contents);

  use() => print("$this has ${contents.length} items.");
}

class Sword implements Item {
  int damage = 5;

  use() => print("$this dealt $damage damage.");
}

// Classes can extend other classes.
class DiamondSword extends Sword {
  int damage = 50;
}

main() {
  // The 'new' keyword is optional.
  var chest = Chest<Item>([
    DiamondSword(),
    Sword(),
  ]);

  chest.use();

  for (var item in chest.contents) {
    item.use();
  }
}
```

実行結果。

```
$ dart classes.dart 
Instance of 'Chest<Item>' has 2 items.
Instance of 'DiamondSword' dealt 50 damage.
Instance of 'Sword' dealt 5 damage.
```

## 参考資料
- [Dart documentation \| Dart](https://dart.dev/guides)
- [Language samples \| Dart](https://dart.dev/samples)
- [Dart \- Dart API docs](https://api.dartlang.org/stable/2.7.0/index.html)