以下のようにして,引数を渡すことができます.
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
以下のようにして,戻り値を受け取ることができます.
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
ベクトル値で返してください.
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
配列やベクトル値に代入することで,関数テーブルのように扱うこともできます.