foreachで勘違い->いろんな言語でイテレート

foreachってfor+eachですよね。当たり前ですよね。うちは、本日までfor+reachでforeachだと思ってました。配列の要素をひとつづつたどって、最後の要素に「たどり着くまで」っていうイメージだったんですよ。ショック。こうなりゃ、各言語で配列やリストをイテレートしてみようじゃないか!

C言語

とりあえず、静的言語の代表でC。この言語での配列をたどるイメージが私を、まちがいへと追い込んだのだ。

#include <stdio.h>

int main (int argc, char *argv[]) {
  char *yukari[] = {"Happy", "fancy", "baby", "doll"};
  int i;

  for (i = 0; i < 4; i++) {
    printf("%s!\n", yukari[i]);
  }
  return 0;
}

Perl

foreachをつかうPerl。だまされました。

my @yukari = qw(Happy fancy baby doll);
foreach (@yukari) {
    print "$_!\n";
}

Python

Pythonはきれいで良いね。

yukari = ['Happy', 'fancy', 'baby', 'doll']
for call in yukari:
    print "%s!" % call 

Ruby

Rubyはブロックを使うのでほかとちょっと雰囲気がちがいます。ブロックはいろいろできてたのしい。

yukari = ['Happy', 'fancy', 'baby', 'doll']
yukari.each do |call|
    puts "#{call}!"
end

Scheme

なんか、勢いで書いてみた。ほんとにかじった程度なのでまとなコードなのかさえ不明。

(define yukari '("Happy" "fancy" "baby" "doll"))
(define (printcall l)
  (print (string-append (car l) "!"))
  (call (cdr l)))
(define (call l)
  (if (null? l)
      '()
       (printcall l)))
(call yukari)

イテレートしてると言っていいのかこれ。

まとめ

というわけで、いろんな言語でイテレートしてみました。いろんな言語で書いてみるとおもしろい。RubyやPythonはきれいで好きです。Rubyなんかはもうeachっていうメソッドだしね。reachとか全く関係ないです。

さて、念のためそれぞれのコードの実行結果をのせておきます。どれも同じ出力ですね。メッセージを改行区切りで表示します。

$ ./fancy 
Happy!
fancy!
baby!
doll!

Happy! fancy baby doll!! てなことで、明日、田村ゆかり Concert Tour 2006 * fancy baby doll *に行ってきますよ!せいいっぱい楽しむぞ!

銀の旋律、記憶の水音。

銀の旋律、記憶の水音。