Hatena::ブログ(Diary)

コードの恵み

2012-02-11

[] IoLanguage on コマンドプロンプト

Bruce A. Tate 氏の『7つの言語 7つの世界』を読んでいる。

検索してみると結構読まれているようだ。

404 Blog Not Found:コードについて書く方がコードを書くより読まれる現実』 があるにもかかわらず

書評ではなく、読んでコードが書かれているということは本にパワーがあるということだ*1

観測できなければいい本ではないということはないが、いい本は観測できる。


Io とは

Io は2週目*2の言語として登場するプロトタイプ・ベース・オブジェクト指向言語

Windows もバイナリ版が用意されているのでそれを使えばよいのだけど何故かライブラリが参照できない場合があった。

  • io.exe があるディレクトリから起動した場合
Io 20110905
Io> Random value(100)
==> 17.328529828228056
  • io.exe があるディレクトリにパスを通した場合
Io 20110905
Io> Random value(100)

  Exception: Object does not respond to 'Random'
  ---------
  Object Random                        Command Line 1

というわけで以下のサイトを参考にしてソース版をコンパイルしてみた。

参考: Building the Io Language on Windows - Streamhead


コンパイル環境

環境

  • Windows 7 64bit
  • Io のソースは Tags ? stevedekorte/io ? GitHub から 2011.09.12.zip をダウンロード
  • MinGW は以前 mingw-get-inst-20101030.exe でインストールしたもの
  • CMake はインストールしていなかったので最新版

使うツールは use.bat でパスを通すことにしている。

  • INS_DIR はツールをインストールしているディレクトリ
  • GCC の設定は適当なので今回はこれでコンパイル通りましたよ程度で*3

今回使用した環境設定部分

@echo off

goto case_%1


:case_cmake
  set PATH=%PATH%;%INS_DIR%\cmake-2.8.7-win32-x86\bin
  goto :case_end


:case_gcc
:case_g++
  doskey g++=g++ --exec-charset=cp932 -Wl,--enable-auto-import $*
  set GCC_VER=4.5.0
  set GCC_EXEC_PREFIX=%INS_DIR%\MinGW
  set PATH=%PATH%;%GCC_EXEC_PREFIX%\bin
  set PATH=%PATH%;%GCC_EXEC_PREFIX%\libexec\gcc\mingw32\%GCC_VER%
  set C_INCLUDE_PATH=%C_INCLUDE_PATH%;%GCC_EXEC_PREFIX%\include
  set C_INCLUDE_PATH=%C_INCLUDE_PATH%;%GCC_EXEC_PREFIX%\lib\gcc\mingw32\%GCC_VER%\include
  set CPLUS_INCLUDE_PATH=%CPLUS_INCLUDE_PATH%;%GCC_EXEC_PREFIX%\include
  set CPLUS_INCLUDE_PATH=%CPLUS_INCLUDE_PATH%;%GCC_EXEC_PREFIX%\lib\gcc\mingw32\%GCC_VER%\include
  set CPLUS_INCLUDE_PATH=%CPLUS_INCLUDE_PATH%;%GCC_EXEC_PREFIX%\lib\gcc\mingw32\%GCC_VER%\include\c++
  set CPLUS_INCLUDE_PATH=%CPLUS_INCLUDE_PATH%;%GCC_EXEC_PREFIX%\lib\gcc\mingw32\%GCC_VER%\include\c++\mingw32
  set LIBRARY_PATH=%LIBRARY_PATH%;%GCC_EXEC_PREFIX%\lib
  set LIBRARY_PATH=%LIBRARY_PATH%;%GCC_EXEC_PREFIX%\lib\gcc\mingw32\%GCC_VER%
  goto :case_end


:case_io
  set PATH=%PATH%;%INS_DIR%\Io\bin
  set PATH=%PATH%;%INS_DIR%\Io\lib
  goto :case_end


:case_end

コンパイル

展開したソースディレクトリにいる状態から

> use gcc

> gcc --version
gcc (GCC) 4.5.0
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

> use cmake

> cmake --version
cmake version 2.8.7

> mkdir build
> cd build

> cmake-gui

ソースディレクトリと build ディレクトリを指定して Configure ボタンを押す。

MinGW を選択する。

CMAKE_INSTALL_PREFIX に Io をインストールしたいディレクトリ*4を指定して再度 Configure ボタンを押す。

Generate ボタンを押す。

CMake を終了

> mingw32-make install
...
...
...
> use io

> io
Io 20110905
Io> Random value(100)
==> 71.665877569466829
Io> exit


Io に少し触れてみる

Io で面白いと思ったのはが予約語がないこと。

Io でフィボナッチ数列を書いてみる。

Io> fib := method(n, if(n == 1 or n == 2, 1, fib(n-2) + fib(n-1)))
==> method(n,
    if(n == 1 or n == 2, 1, fib(n - 2) + fib(n - 1))
)
Io> fib(10)
==> 55

Java でいうところの 3項演算子 みたいな if なのだが

Io> fib := method(n,
...   if(n == 1 or n == 2) then(
...     return 1
...   ) else(
...     return fib(n-2) + fib(n-1)
...   )
... )
==> method(n,
    if(n == 1 or n == 2) then(return 1) else(return fib(n - 2) + fib(n - 1))
)
Io> fib(10)
==> 55

if then else のように普通の if 文のようにも記述できる。

この場合 if 文は値を返さないので return が必要になる。

という風にも読めるのだけれども実は if は Object のメソッドで then は true (または false) のメソッドだった。

Io> true then("TRUE" println)
TRUE
==> nil
Io> false then("TRUE" println)
==> false
Io> nil else("FALSE" println)
==> nil
Io> false else("FALSE" println)
FALSE
==> nil

Java で言うところの「流れるようなインターフェイス」で構成されていた。


最後に

ルールがシンプルのなところに好感がもてた。

プログラマの中には九九を F の段「えふえふいーじゅういち」まで言えそうな人たちがいるので、いくらルールが複雑でも対応できる人はできるだろう。

ただ、そういう人達でも理解する側から説明する側に回ればシンプルな方を選ぶ人が多いはずだ。

弱点として読みにくいと書かれていたが本の内容の範囲ではそれほど感じなかった。

*1:読むと自分では気づかない点も気づけて2度おいしい

*2:1週1言語。授業3日、自習3日、休日1日

*3:MinGW 更新したらコンパイルできなかった

*4:自分の場合は %INS_DIR%/Io