■ サブルーチンに関するもの

Q. サブルーチンに引数を渡すことはできますか

以下のようにして,引数を渡すことができます.

1 GOSUB SUB, (1,2,3)
2 END
3 .SUB(X,Y,Z)
4 PRINT X; PRINT Y; PRINT Z
5 RETURN

以下のように書くこともできます.

1 SUB(1,2,3)
2 END
3 .SUB(X,Y,Z)
4 PRINT X; PRINT Y; PRINT Z
5 RETURN

Q. サブルーチンから戻り値を返してもらうことはできますか

以下のようにして,戻り値を受け取ることができます.

1 GOSUB ADD, (1,2,3), RETVAL
2 PRINT RETVAL
3 END
4 .ADD(X,Y,Z)
5 RETURN X+Y+Z

以下のように書くこともできます.

1 RETVAL = ADD(1,2,3)
2 PRINT RETVAL
3 END
4 .ADD(X,Y,Z)
5 RETURN X+Y+Z

Q. 複数の戻り値を返すことができますか

ベクトル値で返してください.

1 GOSUB ADD, (1,2,3), RETVAL
2 PRINT RETVAL
3 END
4 .ADD(X,Y,Z)
5 RETURN (Y+Z,Z+X,X+Y)

Q. サブルーチンの内部のみで有効なローカル変数を定義することはできますか

NLLには変数のスコープという概念はありません.変数はすべてグローバルです.

このためサブルーチン内部のローカル変数は定義できません. (そもそもNLLでは,サブルーチンへのジャンプは単なるジャンプであり,サブルーチンの中と外というコード上の区別がありません)

ただしサブルーチンの先頭と終端でスタックを利用して変数の値を保存・復旧することで,(見かけ上は)変数をローカル変数のように扱うことができます.

以下は変数A,Bの値をスタックに保存・復旧することで,変数A,Bをローカル変数のように扱っている例です. (A+で変数Aをスタックに保存,A-でスタックから値を復旧します)

1 A=1; B=2
2 (D, C) = SUBR(10, 20)
3 PRINT A,B,C,D
4 END
5 .SUBR(A+, B+)
6 A++; B++
7 PRINT A; PRINT B
8 RETURN (B-, A-)

Q. サブルーチンをC言語の「関数へのポインタ」のように扱うことはできますか

関数と同様に,サブルーチンのラベルも値として扱えて,変数に代入できます.

1 F = LABEL
2 F(10)
3 END
4 .LABEL(X)
5 PRINT X
6 RETURN

配列やベクトル値に代入することで,関数テーブルのように扱うこともできます.


メールは kozos(アットマーク)kozos.jp まで