デフォルト引数が評価されるタイミング

デフォルト引数が評価されるタイミングが気になったので、ちょっと実行してみました。

c++のコード

#include <iostream>
#include <cstdlib>
#include <ctime>

void func(int i = rand())
{
    std::cout << i << std::endl;
}

int main(void)
{
    srand(time(NULL));
    func();
    func();
    func();
    return 0;
}

c++の結果

247111784
168458104
1083831553

rubyのコード

def func(i = rand())
  print "#{i}\n"
end

func
func
func

rubyの結果

0.418264634981435
0.894746224876965
0.805637328790286

pythonのコード

import random

def func(i = random.random()):
    print i

func()
func()
func()

pythonの結果

0.542012394526
0.542012394526
0.542012394526

というわけで、c++rubyは関数呼出時、pythonは関数定義時にデフォルト引数が評価されているようです。

SBCL 1.0.46リリース

Steel Bank Common Lispのバージョン1.0.46がリリースされました。

New in version 1.0.46 - Steel Bank Common Lisp

Getting Started - Steel Bank Common Lispを見ながら、ubuntu 10.10 64bit版でビルドしてみます。

wget http://downloads.sourceforge.net/project/sbcl/sbcl/1.0.46/sbcl-1.0.46-source.tar.bz2
tar xjf sbcl-1.0.46-source.tar.bz2 
cd sbcl-1.0.46
bash make.sh

手元のPhenom 9150e機だと約10分で完了します。そしてテスト。

cd tests
bash run-tests.sh

10分程で完了し失敗しました…

Finished running tests.
Status:
 Failure:             compiler.pure.lisp / BUG-654289
 Expected failure:    packages.impure.lisp / USE-PACKAGE-CONFLICT-SET
 Expected failure:    packages.impure.lisp / IMPORT-SINGLE-CONFLICT
test failed, expected 104 return code, got 1

言語設計者たちが考えること

言語設計者たちが考えること (THEORY/IN/PRACTICE)

言語設計者たちが考えること (THEORY/IN/PRACTICE)

様々な言語の設計者に対するインタビュー集です。
各人の意識している問題点や、それに対する解決策としての言語構造等、考え方の違いが比較できるお勧めの本です。

プログラミング作法?

プログラミング作法

プログラミング作法

久しぶりに読み直して見ましたが、依然としてかなり好きな本です。(プログラミング作法という邦題が良い訳なのか疑問ですが…)
内容的には、細かいネーミングのルールから、設計、テスト、デバッグ等々ソフトウェア開発全般を扱っています。一応Cに限定せずに書かれていますが、基本的にはCプログラマにお勧めです。