関数を定義すると、次のイベントが発生します。
関数定義が評価され、関数値が作成されます。
関数 <name>
の名前を使用して、新規変数が宣言されます。
関数値がその変数に設定されます。
関数値が関数定義式の結果として返されます。
この関数はそれ自体が変数に格納された値なので、関数名の変数を使って関数を呼び出せるだけではありません。関数変数を参照するだけで、関数の値をほかの変数に割り当てたり、配列に格納したり、または引数としてほかの関数に渡したりすることもできます。
例
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
に代入されます。また、この例は関数がどのような式内にでも定義できることを示しています。