2017年5月8日月曜日

ある言語の引数評価戦略が、「値渡し」か「参照渡し」かを機械的に見分ける簡単な方法

なお、ローカル変数があることは前提にしていますが、いま使われている言語でそれがない言語というのもまずなかろうと思うので、別に問題にはならないでしょう。

問題にならなくても、ローカル変数がない場合にも判定できるようにしてみた。

コード(Emacs)

C言語

#include <stdio.h>

void swap(int x, int y) {
  x += y;
  y = x - y;
  x = x - y;
}

int main() {
  int x = 1;
  int y = 2;

  printf("x = %d, y = %d\n", x, y);
}

Ruby

#!/usr/bin/env ruby2.4
# -*- coding: utf-8 -*-

def swap(x, y)
  x += y
  y = x - y
  x = x - y
end

x = 1
y = 2
swap(x, y)

puts "x = #{x}, y = #{y}"
  

入出力結果(Terminal)

$ cc sample12.c && ./sample12
x = 1, y = 2
$ ./sample12.rb 
x = 1, y = 2
$

ただ、上記のコードでも、

この判定方法は、通常の関数やサブルーチンを持つほとんどの言語において有効な方法だと思いますが、実行モデルが普通の言語とあまりにも違う場合には適用できないかもしれません。また、引数への再代入が不可な言語では、↑のようなプログラム自体を作ることが無理ですが、そのような言語はまず間違いなく値渡しです。
は変わらず。

0 コメント:

コメントを投稿