関数変数

関数を定義すると、次のイベントが発生します。

この関数はそれ自体が変数に格納された値なので、関数名の変数を使って関数を呼び出せるだけではありません。関数変数を参照するだけで、関数の値をほかの変数に割り当てたり、配列に格納したり、または引数としてほかの関数に渡したりすることもできます。

surface_functions=#()
fn build_math_mesh x = print "build math mesh"

-- some 3D surface functions
fn saddle x y = sin x * sin y
fn sombrero x y = cos (x^2 + y^2) / (1 + (x^2 + y^2))
print (saddle 1 1) -- try one out
surface_functions[1] = saddle -- store the functions in an array
surface_functions[2] = sombrero
-- call one of them from within the array:
z = (surface_functions[1]) 10 10
-- pass one in to a higher-order function:
build_math_mesh sombrero

関数変数のスコープは、現在の MAXScript スコープのコンテキストです。関数内で使用される変数は、その変数が既に上のレベルのスコープで定義されていたり、関数内でグローバル変数として宣言されていない限り、ローカル スコープを持ちます。例外として関数パラメータ変数があり、この変数は常にローカル スコープを持ちます。

スクリプトを作成するときは、ローカル変数およびグローバル変数を明示的に宣言することをお勧めします。暗示的な宣言は簡易的に提供されるものであり、通常、リスナーでインタラクティブに作業する場合や短いスクリプトを作成する場合に使用します。長いスクリプトを作成する場合は、変数を明示的に宣言するとエラーを軽減し、コードが読みやすくなります。また、特にグローバル変数を必要な場合を除き、すべての変数をローカルとして宣言することをお勧めします。この理由については、「変数のスコープ」を参照してください。

関数変数が別の変数に割り当てられている場合は、関数値への参照はその変数に格納されます。したがって、関数変数がスコープ内になくても、関数が割り当てられている変数のスコープが現在の MAXScript スコープ コンテキスト外である場合、関数自体はスコープ内にあることになります。

fn funcA which =
(
if which == 1 then
fn saddle x y = sin x * sin y
else
fn sombrero x y = cos (x^2 + y^2) / (1 + (x^2 + y^2))
)
myfunc=funcA 2
z=myfunc 10 10

上記の例では、変数 saddle および sombrero のスコープは funcA に対してローカルであり、変数は関数の外ではスコープの範囲外となります。 funcA の戻り値は、関数 saddle() または sombrero() のいずれかの値をとり、変数 myfunc に代入されます。また、この例は関数がどのような式内にでも定義できることを示しています。

関連事項