Mac OS XにMacPortsを使ってGCCをインストール

Mac OS XMacPortsを使ってGCCをインストールした時のメモです。


まずMacPortsでインストールできるGCCのバージョンを検索します。

$ port search gcc
...
gcc44 @4.4.5 (lang)
The GNU compiler collection

gcc45 @4.5.2 (lang)
The GNU compiler collection

gcc46 @4.6-20101218 (lang)
The GNU compiler collection, prerelease BETA
...


今回はgcc45を選択してインストールしました。

$ sudo port install gcc45


MacPortsは、インストールしただけだとコマンドの後ろにバージョンが付いてます。
今回はシンボリックリンクを作成しました。(以下はg++の例)

$ cd /opt/local/bin
$ sudo ln -s g++-mp-4.5 g++


これでGCC 4.5.2のg++コマンドが使えるようになりました。

C#のforeach内で現在のループ回数を知る

こちらで紹介されていたのを、自分でも書いてみました。
http://mag.autumn.org/Content.modf?id=20100726164321
http://blogs.wankuma.com/rti/archive/2010/07/27/191691.aspx
http://d.hatena.ne.jp/okazuki/20100728/1280300415


foreachの中で現在のループ回数を知りたい時に、Selectメソッドを使うことで次のように書くことができます。

using System;
using System.Linq;

public class Program
{
    static void Main()
    {
        var lines = new[] { "abc", "def", "ghi" };
        foreach (var line in lines.Select((v, i) => new { Index = i, Value = v }))
        {
            Console.WriteLine("lines[{0}] = \"{1}\"", line.Index, line.Value);
        }
    }
}

実行結果:

lines[0] = "abc"
lines[1] = "def"
lines[2] = "ghi"

他にもSelectなどのEnumerableから提供されているメソッドで使えるようです。

前後の要素同士でペアを作って反復処理

コレクションの前後の要素同士でペアを作って反復処理するメソッドを、拡張メソッドで実装してみました。

using System;
using System.Collections.Generic;

static class EnumerableExtension
{
    public static void ForEachPair<T>(this IEnumerable<T> collection, Action<T, T> action)
    {
        if (collection == null) { throw new ArgumentNullException("collection"); }
        if (action == null) { throw new ArgumentNullException("action"); }
		
        var enumerator = collection.GetEnumerator();
        if (!enumerator.MoveNext()) { return; }
		
        var previousValue = enumerator.Current;
        while (enumerator.MoveNext())
        {
            action(previousValue, enumerator.Current);
            previousValue = enumerator.Current;
        }
    }
}

class Program
{
    static void Main()
    {
        var numbers = new[] { 0, 1, 2, 3, 4 };
        numbers.ForEachPair((x, y) => Console.WriteLine(x + y));
    }
}

このコードでは、0から4までの配列に対して、前後の要素同士を足してコンソール出力する処理をしています。

実行結果:

1
3
5
7

Scalaのif式

Scalaのif式は、他の多くの言語とほぼ同じ動作をしますが、戻り値を持っているのが特徴です。

まず戻り値を使わないケースを書いてみます。

object IfTest {
  def main(args: Array[String]) {
    var visitor = "anonymouse"
    if (!args.isEmpty) {
      visitor = args(0)
    }
    println("Hello " + visitor + '.')
  }
}

プログラムの引数に挨拶するだけのプログラムです。
引数が無い時は、"anonymouse"に挨拶します。


次に、上で書いたプログラムを、if式の戻り値を利用するように書き換えてみます。

object IfTest2 {
  def main(args: Array[String]) {
    val visitor = if (args.isEmpty) "anonymouse" else args(0)
    println("Hello " + visitor + '.')
  }
}

ifの条件式がtrueならば"anonymouse"、falseならば引数の0番目の要素でvisitorを初期化します。
varで宣言していた変数visitorをvalで宣言出来るのも、メリットのひとつですね。

F#でHello world

Windows環境の場合:

  1. ここから"InstallFSharp.msi"をダウンロードする
  2. ダウンロードした"InstallFSharp.msi"を実行し、インストールする
  3. インストールしたフォルダの下の、binフォルダの中にある"fsi.exe"を実行(デフォルトでは"C:\Program Files\FSharp-1.9.7.8"\bin\fsi.exe")
  4. コンソールにコードを書いてエンターキーを押すと、プログラムが実行される


例えば手順4で次のように入力し実行すると、

printf "Hello world!";;

コンソールには次のように表示される。

Hello world!val it : unit = ()