続き 社内研修用ネタ

昨日の続き。


問題を再掲する。
「2つの引数を与えその値を入れ替える関数swapを書け。」
昨日はC言語で2本と、C++をアップした。

Perl
Perlのリファレンス。Cのポインタと同じような使い方ができる。
ポインタ演算は無いがCウィザードにとっては理解が容易だろう。

#!/usr/bin/perl -Wall

use strict;

sub swap
{
    my ($refX, $refY);

    ($refX, $refY) = @_;
    ($$refX, $$refY) = ($$refY, $$refX);
}

# main start
my ($x, $y);

($x, $y) = (3, 7);

print 'before: $x = ' . $x . ', $y = ' . $y . "\n";
swap(\$x, \$y);
print 'after: $x = ' . $x . ', $y = ' . $y . "\n";

__END__

2つの値の交換にtmp変数がいらないのが好きだ。
でもまぁ本質的にはCと変わらないかな。


Java

public class Swap {
	int hoge;
	
	public Swap(int x) {
		hoge = x;
	}	
	private static void swap(Swap x, Swap y) {
		Swap tmp = new Swap(0); // Dummy
		tmp.hoge = x.hoge;
		x.hoge = y.hoge;
		y.hoge = tmp.hoge;	
		return;
	}

	public static void main(String[] args) {
		Swap x = new Swap(3);
		Swap y = new Swap(7);
		
		System.out.println("before: x = " + x.hoge + ", y = " + y.hoge);
		swap(x, y);
		System.out.println("before: x = " + x.hoge + ", y = " + y.hoge);	
	}
}

Javaでは変数のポインタが取れないので今までものとは処理の毛色が違う。サンプルコードなので
フィールドが一つしかないclassを作ってフィールドの値を入れ替えたが、フィールドの数が増えると
面倒になる。cloneを使おうとしたけどcloneって何でこんなにややこしいんだ?ってことでこれでお茶を濁しておく。


次、DelphiっつーかPascal
仮引数で参照渡しを宣言しておく。
C++と同じで呼び出し側で勝手に値が変わるとびっくりするから嫌な感じがする。

program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

procedure swap(var x:integer; var y: integer);
var tmp: integer;
begin
  tmp := x;
  x := y;
  y := tmp;
end;

var x, y: integer;
begin
  x := 3;
  y := 7;
  writeln('before: x = ', x, ', y = ', y);
  swap(x, y);
  writeln('after: x = ', x, ', y = ', y);
end.

書き方は素直でよく考えられた言語だと思う。
ちなみに初めて本格的にプログラミング言語を習ったのは大学で習ったPascalが初めて
だったので思い入れがあります。
だけど世の主流はC言語とその派生なのでちょっとさわっていない期間があると、微妙に違うところがいらついてしまう。特に代入はよく使う演算子なのに2ストロークだし
私のように自宅では英字キーボード勤務先ではJISキーボードとかだと:の位置が違うので
とまどってしまう。