Pacal再入門:ArgvとArgc

 再入門だから、興味本位で順序は無茶苦茶。今更Algolがどうのこうのとか、教育用言語としての有効性を検証しても仕方がない。

 

 argv, argcが組み込み関数だとしたら、別にprogramの引数として記述しなくても、特段の宣言をせずにコードの中に直接記述しても機能するはずという事で、次のようなコードを書いてみた。

program arg0;
var
    count : integer;
begin
    for count:=1 to argc-1 do writeln(argv[count]);
end.

 結果としては、問題なく処理された。

 ここでは、argvを配列のように扱っている。ところが、Oracleの解説では、

The argv procedure assigns the specified program argument to a string variable.

Syntax
argv(i, a)

Arguments
i is an integer value.
a is a fixed- or variable-length string.

Return Value
argv returns a string variable.

Comments
argv returns the i'th argument of the current process to the string variable a. i
ranges from 0, the program name, to argc-1.
argc is a predeclared function that tells you how many arguments are being
passed to the program. argv is normally used in conjunction with argc.

 となっていて、argvを完全に関数扱いしている。

 昔読んだ入門書では配列扱いの解説だったので、特別な変数だと思い込んでいたのだが、ちょっと試してみる必要がある。

program arg1;

var

   count : integer; 

   a        : string;

begin

   argv(3, a);

   writeln(s);

end. 

  上のようなコードを書いてみたが、argv(3, a);のところで、

Syntax error, ";" expected but "(" found 

 とコンパイルエラーになった。対象としている処理系の仕様の違いだろう。非標準だから仕方がないし。いちいち変数を宣言してアサインして使うより、配列変数として振舞ってくれた方がシンプルで有難い。

 ただ他のPascal処理系で使うとエラーになるという可能性は知っておく必要がある。

 ちなみに、argv[0]はコマンドとして使われた文字列を引数も含めて全て返してくる。

 

 argvとargcについては、これでいいだろう。