リストを含んだJSLスクリプトを実行すると、リストが戻り、リストの中の項目は評価されません。
b = 7;
x = {1, 2, b, Sqrt( 3 )};
Show( x );
x = {1, 2, b, Sqrt(3)};
リスト内の項目を評価するには、Eval List()関数を使います。
b = 7;
x = {1, 2, b, Sqrt( 3 )};
c = Eval List( x );
{1, 2, 7, 1.73205080756888}
リストを参照する変数のリストを使用する際には、Eval()関数を使用する必要があります。
次の例を見てください。ここでは、12項目のリストであるfullMonthと呼ばれる変数が使われています。
::fullMonth = {January, February, March, April, May, June, July, August, September, October, November, December};
::abbrevMonth = {Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec};
::dow = {Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday};
::levels = {Very Low, Low, Medium Low, Medium, Medium High, High, Very High};
::feel = {Strongly Disagree, Disagree, Neutral, Indifferent, Agree, Strongly Agree};
::rating = {Failing, Unacceptable, Very Poor, Poor, Bad, Acceptable, Average, Good, Better, Very Good, Excellent, Best};
::mlist = {::fullMonth, ::abbrevMonth, ::dow, ::levels, ::feel, ::rating};
N Items(::fullMonth); // fullMonthには12個の項目があるため12を戻す。
N Items(::mlist[1]); /* ::mlist[1]は変数(fullMonth)であり、かつfullMonthはリストであるため、「N Items()引数はリストでなければなりません」というメッセージを戻す。*/
Eval()関数を追加すると、
N Items( Eval( ::mlist[1] ) );
12
/* ::mlist[1]には::fullMonthが格納されており、それを評価すると::fullMonthのリストが
戻されるため、12を戻す。*/
ループでは、入れ子になったループ内のEval()関数が変数の内容を評価するようにします。たとえば、次のような手順で要約できます。
For( g = 1, g <= N Items( ::mlist ), g++,
For( i = 1, i <= N Items(::mlist[g]), i++,
Show( ::mlist[g][i] )
)
);
// 「N Items()引数はリストでなければなりません」というメッセージを戻す。
この問題を修正するには、Eval()関数を追加します。
::mlist = {::fullMonth, ::abbrevMonth, ::dow, ::levels, ::feel, ::rating};
For( g = 1, g <= N Items( ::mlist ), g++,
For( i = 1, i <= N Items( Eval( ::mlist[g] ) ), i++,
Show( ::mlist[g][i] )
)
);