約 4,456,532 件
https://w.atwiki.jp/terragen/pages/199.html
Node Type Colour Shader ノード説明と目的 『Shader array』は、シェーダの配列またはグリッド(格子)を作成します。ポピュレーションのようなランダム配置ではなく、規則的な間隔を空けて配置されたグリッド上で動作しますが、シェーダ用のポピュレーションと捉えても差し支えありません。 『Shader array』は、1つのシェーダを取り入れ、異なる位置に複数回シェーダを複製します。 『Shader array』は、3Dプレビューの中に非常に多くの情報を示します。配列における各シェーダのインスタンスの位置にオレンジ色の点を描画します。その点は配列のエリアをボックスで囲みます。"Limit effect are"にチェックを入れた場合、配列エリアに"Boundary padding"を加えた広さを示す破線を描画されます。デフォルトでは、『Shader array』は配列の各隅にシェーダインスタンスを表示します。すべてのシェーダインスタンスをプレビューする事が出来ますが、これは3Dプレビューが遅くなり操作し辛くなります。 下の画像は、"Row(行)"と"Columns(列)"の関係と、『Shader array』の全体的なレイアウトを示しています。この配列は3行4列です。シェーダはオレンジ色の点で表されます。 現在、『Shader array』は、垂直方向に真っすぐの"Plan Y"投影にのみ適用されます。 動作の諸注意 『Shader array』は、特に多数の行と列がある場合、速度が遅くなる可能性があります。10×10の配列には100個のシェーダがあります。100×100の配列になると、10,000個分ものシェーダ計算をする事になります。最も効率的なシェーダは、『Simple shape shader』や『Image map shader』のように効果がエリア内に制限されたシェーダです。動作を向上するために、"Limit effect area"や"Boundary padding"の設定を使って、『Shader array』の効果範囲を制限する事も出来ます。 サンプルファイル このプロジェクトファイルは、『Shader array』を使用して『Simple shape shader』のグリッドを作成するサンプルです。プロジェクトファイルは右クリック(Windows)"で名前を付けてリンク先を保存"、またはOptionキー(Mac)を押して直接ダウンロードして下さい。 Shader_array_example.tgd 設定 Position 位置 『Shader array』ノードの配列を設置する左下角の座標を設定します。 Rotation 回転 このパラメータは、左下角を基準に配列の回転角度を設定します。回転は、Y(垂直)軸を中心にのみ回転する事が出来ます。 Number of columns 列数 配列の列数を設定します。 Column spacing 列間 列間の距離を設定します。単位はメートル。 Number of rows 行数 配列の行数を設定します。 Row spacing 行間の距離を設定します。単位はメートル。 Limit effect area 効果エリアの制限 チェック時、シェーダの効果は配列で囲まれたエリア外には適用されません。"Boundary padding"設定を使用して、このエリアを拡張する事が出来ます。 Boundary padding 境界の拡張 この設定は、"Limit effect area"がチェック時、配列の境界付近のエリアを拡張します。これは、下の画像のように配列が任意のエリアからはみ出さないようにコントロールする場合に便利です。基本的には、境界の拡張部分一杯まで配列を埋め込みます。左画像に比べて右画像は、『Simple shape shader』の円の大きさ1000に比べて100の値のため、制限エリアから100メートルを超える円は切り取られてしまいます。(画像はレンダリング結果画像を3Dプレビュー画像の上に半透明で重ねた加工画像です。) Shader シェーダ 配列に使用するシェーダを設定します。 Use shader colour for displacement ディスプレースメントにシェーダのカラーを使用 チェック時、『Shader array』は関連付けたシェーダのディスプレースメント情報を使用するのではなく、カラー情報を使用してディスプレースメントを生成します。これは、関連付けたシェーダが実際にディスプレースメント処理しない場合に特に便利です。 Displacement direction ディスプレースメント方向 ディスプレースメント方向を選択します。右のポップアップは、ディスプレースメントが適用される方向を選択する事が出来ます。ポップアップリスト内の "(requires computed normal)"オプションは、ノードネットワーク上で接続された『Compute Terrain』または『Compute Normal』が適切に動作する事を必要とします -Along vertical ディスプレースメントは、変位を適用する元となるオブジェクト(すなわち、惑星またはモデル)の法線に沿って生じます(デフォルトの場合、『Planet』の平面上からの変位なので"垂直"に生じます)。-Along normal ディスプレースメントは現在のシェーダの法線に沿って生じます。-Vertical only (requires computed normal) ディスプレースメントは、元となるオブジェクト(すなわち、惑星またはモデル)の法線に沿ってのみ生じます。ディスプレースメントは、オブジェクト法線(プリミティブオブジェクト、デフォルトでは『Planet』オブジェクトの法線)とサーフェス法線(作成したサーフェスによって生成された法線)の差でスケーリングされます。ディスプレースメントは、法線間の角度が90度に近づくにつれて減少します。-Lateral only (requires computed normal) ディスプレースメントは、側面の平面内でのみ、すなわち下層のオブジェクトの法線に対して直角にのみ生じます。-Lateral normalized (requires computed normal) これは上記と同じですが、法線は統一化されています(長さが1になるようにスケーリングされます)。 Displacement amplitude ディスプレースメント振幅 この値でディスプレースメントの振幅を決定します。 Displacement offset ディスプレースメントのオフセット この値は、"Displacement multiplier"パラメータで乗算された後に、ディスプレースメントの入力値に加算されます。これにより、ディスプレースメント方向に沿った設定量だけディスプレースメントをオフセットする効果が生じます。正の値はディスプレースメントを押し出して、それが台座に座っているかのように見えます。負の値は、ディスプレイスメントが表層の中に沈みます。それはディスプレースメントを逆にするのではなく、むしろ表層に穴を作り、穴の底にディスプレースメントを適用する事に近いです。 Preview all instances (slow) すべてのインスタンスをプレビュー表示 『Shader array』のデフォルトの動作は、グリッドの四隅のみシェーダインスタンスをプレビュー表示します。つまり、最大で4つのインスタンスが表示されます。これがチェックされている場合、『Shader array』は3Dプレビューのグリッド内にすべてのシェーダインスタンスを表示します。これは、特に行数と列数が多い場合、処理が遅くなる可能性があります。この画像の場合、地形の配列はすべてのシェーダインスタンスのプレビューを表示し、テクスチャの配列はデフォルトの四隅にのみシェーダインスタンスのプレビューを表示しています。
https://w.atwiki.jp/jsmemo/pages/13.html
Array プロパティ constructor Arrayオブジェクトを作成した関数 length Arrayオブジェクトの要素の数 prototype Arrayオブジェクトのprototypeオブジェクト
https://w.atwiki.jp/az-prolog/pages/34.html
az-prologでは配列のような入れ子型は、 リスト型とは別にアレイ型というものがあります。 アレイには大量にデータを入れることができるので、 単位節の代わりに使うと便利です。 簡単に単位節をassertする時間と、 単位節の一番先頭を削除するretractする時間を調べる ベンチマークプログラムを作成してみました。 test - timecount( 1000), timecount( 5000), timecount( 10000), timecount( 30000), timecount( 50000), timecount( 70000), timecount(100000), timecount(300000), timecount(500000), true. timecount(X) - A is cputime, create_func(X), B is cputime, C is B-A, retract(func(X)), D is cputime -B, abolish(func,1), write_listnl([ Num ,X, create_time ,C, retract_time ,D]). create_func(0). create_func(N) -M is N-1,assert(func(N)),create_func(M). テストしてみましょう。 ||?-test. Num 1000 create_time 0.000999927520751953 retract_time 0.00300002098083496 Num 5000 create_time 0.00300002098083496 retract_time 0.0620000362396240 Num 10000 create_time 0.00600004196166992 retract_time 0.260999917984009 Num 30000 create_time 0.0160000324249268 retract_time 2.47800016403198 Num 50000 create_time 0.0679998397827148 retract_time 7.28299999237061 Num 70000 create_time 0.0300002098083496 retract_time 16.6899998188019 Num 100000 create_time 0.0880000591278076 retract_time 40.6140000820160 Heap area exausted ---- Backtrace assert(func(90341)) create_func(300000) timecount(300000) test ?- ヒープ領域がオーバーフローしてしまいました。 これを防ぐのはprolog立ち上げ時にコマンドオプションでヒープ領域を指定しておきましょう。 prolog -h 10000 再度テストしてみましょう。 | ?-test. Num 1000 create_time 0.000000000000000 retract_time 0.00199985504150391 Num 5000 create_time 0.00200009346008301 retract_time 0.0609998703002930 Num 10000 create_time 0.00399994850158691 retract_time 0.249000072479248 Num 30000 create_time 0.0109999179840088 retract_time 2.29399991035461 Num 50000 create_time 0.0190000534057617 retract_time 7.05999994277954 Num 70000 create_time 0.0279998779296875 retract_time 16.8590002059937 Num 100000 create_time 0.0399999618530273 retract_time 40.8570001125336 Num 300000 create_time 0.198000192642212 retract_time 457.813999891281 Num 500000 create_time 1.27499985694885 retract_time 1301.64199995995 create時間が線形的になっていません。 特にretractが数が多くなるごとに時間が多く掛かっています。 この場合、単位節自身を更新しながら追加するような処理には向かないことが分かります。 (例 好きな食べ物の集計 func(焼き肉,3人) →func(焼き肉,4人)) このような時にアレイ型を使うとこの問題が解消されます。 次にアレイ型のベンチマークプログラムを作ってみました。 test - timecount( 1000), timecount( 5000), timecount( 10000), timecount( 30000), timecount( 50000), timecount( 70000), timecount( 100000), timecount( 300000), timecount( 500000), timecount( 700000), timecount( 1000000), timecount( 3000000), timecount( 5000000), timecount( 7000000), timecount(10000000), true. timecount(X) - Y is X-1, A is cputime, create_array(X,Z), B is cputime, C is B-A, D is cputime, sets_array(Z,Y), E is cputime, F is E-D, G is cputime, gets_array(Z,Y), H is cputime, I is H-G, write_listnl([ Num ,X, create_time ,C, sets_time ,F, gets_time ,I]). sets_array(Z,-1). sets_array(Z,N) -set_array(Z,N,N),M is N-1,sets_array(Z,M). gets_array(Z,-1). gets_array(Z,N) -get_array(Z,N,T),M is N-1,gets_array(Z,M). setとgetは経過時間が数に比例して線形的に増加していることが分かります。 Num 1000 create_time 0.000000000000000 sets_time 0.000999927520751953 gets_time 0.000000000000000 Num 5000 create_time 0.000000000000000 sets_time 0.00199985504150391 gets_time 0.00100016593933105 Num 10000 create_time 0.000000000000000 sets_time 0.00300002098083496 gets_time 0.00399994850158691 Num 30000 create_time 0.000000000000000 sets_time 0.00899982452392578 gets_time 0.00900006294250488 Num 50000 create_time 0.000000000000000 sets_time 0.0150001049041748 gets_time 0.0139999389648438 Num 70000 create_time 0.000000000000000 sets_time 0.0210001468658447 gets_time 0.0299999713897705 Num 100000 create_time 0.000999927520751953 sets_time 0.0290000438690186 gets_time 0.0269999504089355 Num 300000 create_time 0.000999927520751953 sets_time 0.0970001220703125 gets_time 0.0950000286102295 Num 500000 create_time 0.00199985504150391 sets_time 0.164000034332275 gets_time 0.160000085830688 Num 700000 create_time 0.00200009346008301 sets_time 0.230999946594238 gets_time 0.216000080108643 Num 1000000 create_time 0.00300002098083496 sets_time 0.322000026702881 gets_time 0.319999933242798 Num 3000000 create_time 0.00999999046325684 sets_time 0.983000040054321 gets_time 0.944999933242798 Num 5000000 create_time 0.0170001983642578 sets_time 1.59099984169006 gets_time 1.57400012016296 Num 7000000 create_time 0.0250000953674316 sets_time 2.26300001144409 gets_time 2.21700000762939 Num 10000000 create_time 0.0350000858306885 sets_time 3.21299982070923 gets_time 3.21100020408630
https://w.atwiki.jp/wicky/pages/82.html
array
https://w.atwiki.jp/ce00582/pages/305.html
array 参考文献(1) プログラム 結果
https://w.atwiki.jp/sas_help/pages/28.html
配列を定義する。 DATAステップステートメントで指定する。 ※複数の変数に対して、同じ処理を行う場合にARRAYステートメントを使用して 配列を定義し、DOステートメントを使用すると便利である。 構文 DATA = SASデータセット名 ; ARRAY 配列名 {要素数} [$] [長さ] [配列要素] [(初期値)]; DO I=1 to 5 ; 配列名{要素数}= x ; /*xを代入*/ END ;run; 使用例 dat1~dat5までの5つの変数をgroup{n}という名前で参照できる。 group{3} … 変数dat3を処理対象とする。 配列名:配列名として有効なSAS名を指定。 ※SAS関数名や同一DATAステップ中のSAS変数名と同じ名前を付けないように注意。 要素数:配列要素の数を表す数値または(またはアスタリスク)を指定。 ※括弧は中括弧{}の代わりに、大括弧[]または丸括弧()を使用することができる。 指定形式その1…配列の各次元の要素数を指定。 1次元配列を定義する場合、その配列の要素数をそのまま指定。 例)3つの要素を持つ1次元配列 ARRAY test {3} red green yellow ; 多次元配列を定義するには、各次元の要素数をコンマで区切って指定。 2次元配列の場合、最初の数値は行、2番目の数値は列に対応。 例)5行3列からなる2次元配列 ARRAY box {5,3} x1-x15 ; 指定形式その2…添字の上限と下限を指定。(添字の下限defortは1。) 例1)添字の下限が76、上限が85の1次元配列 ARRAY yer{76:85} yer76-yer85 ; 例2)ARRAY box {1:5,1:3} x1-x15 ; 指定形式その3…アスタリスク(*)配列の要素数を、引数配列要素に指定された 変数の数から割り出す。(配列要素の指定が必須。多次元配列では指定できない。) $ :配列の要素がすべて文字であることを示す。 length :配列要素の長さを指定。 配列要素 :配列に指定したい変数をブランクで区切って列挙。 指定する変数の型はすべて同一でなければならない。 ※下記のキーワード指定し、データステップ内で定義されたSAS変数を定義する。 _ALL_ 全てのSAS変数(SAS変数の型が全て同一でなければならない。) _NUMERIC_ 全ての数値変数 _CHARACTER_ 全ての文字変数 ※要素数に数値を指定した場合、変数リストが省略できる。 配列名のあとに1、2、…nがついた変数名を自動的に作成する。 _TEMPORARY_ 一時変数からなる配列が定義(中間結果を保存するときに使用。) 変数名を持たない。(値は配列名と添字によって参照される。) SASデータセットに書き出されない。 データステップによるオブザベーションに対する反復処理の開始時に欠損値に初期化されない。 要素数に*を指定した場合、_TEMPORARY_は指定できない。 初期値:初期値の区切りにはカンマの代わりにブランクも指定できる。 配列要素に指定した変数の左から順に割り当てられる。 初期値の値より、配列の要素の個数が多いときは、残りの配列要素に欠損値が入る。 配列要素の属性(長さや型など)を指定していない場合、初期値の最初の値により、 配列の全変数の属性が決定する。 例) ARRAY test1{3} t1 t2 t3 (90, 80, 70); ARRAY test2{3} a1 a2 a3 ( a b c ); データ加工ver1とデータ加工ver2は同じ結果である。 /*テストデータ*/ data test1; do i=1 to 2 ; a=1; b=2; c=3; d=4; e=5; f=6; output; end; run; /*データ加工ver1*/ data test2_1; set test1; array box(3) x1-x3; box(1)=a; box(2)=b; box(3)=c; output; box(1)=d; box(2)=e; box(3)=f; output; run; /*データ加工ver2*/ data test2_2 ; set test1; array in (6) a b c d e f; array box(3) x1-x3; do i=1 to 3; if in(i) eq . then box(i) = . ; else box(i) = in(i) ; end; output; do i=4 to 6; if in(i) eq . then box(i-3) = . ; else box(i-3) = in(i) ; end; output; run;
https://w.atwiki.jp/tmiya/pages/131.html
Scala 2.8 配列 (Scala 2.8 Arrays) Martin_Odersky、EPFL 2009 年 10 月 1 日 英語PDF 問題 (The Problem) Scala では、配列は最もトリッキーな概念の 1 つであることが分かりました。 望ましいことを破綻させる、非常に難しい制約を扱わなければなりません。 一方で我々は、Java と相互運用するために配列を使うことを望みます。このため、配列は Java と同じ表現でなければなりません。 この下位レベル表現は、配列で高パフォーマンスを得るにも役立ちます。 しかし他方、Java の配列には厳しい制限があります。 まず、Java にはただ一つの配列型表現ではなく、実際には 9 つの異なる表現があります。 参照型の配列のための表現が 1 つと、プリミティブ型 byte、char、short、int、long、float、double と boolean 等に対する 8 つの表現があります。 これらの異なる表現に共通の型はなく、単なる java.lang.Object よりいっそう特化しおり、java.lang.reflect.Array 中には任意の型の配列を扱ういくつかのリフレクション関連のメソッドさえあります。第二に、ジェネリック型の配列を生成する方法がありません。; ただ単相的な配列生成だけが許されています。 第三に、配列がサポートする操作は、インデックス付け、更新、長さのみです。 Scala で我々がしたいことと比べてみてください。 配列を、シーケンス上で定義される数百かそれ以上のメソッドをサポートするコレクション階層中に位置づけるべきです。 それらは必ずジェネリックで、型変数 T に対して Array[T] を生成できるべきです。 過去 (The Past) Java との相互運用性およびパフォーマンスのために課せられた表現上の制約と、これら望まれることとをどのように統合できるでしょうか? 簡単な答えはなく、そして私は、我々が Scala を最初に設計したときに間違いをおかしたと思っています。 Scala 言語は 2.7.x まで、ボクシング/アンボクシングと呼ばれる処理で必要とされるときに、「魔法のように」配列をラップ/アンラップしていました。 それは、プリミティブな数値型をオブジェクトとして扱うときにすることと似ています。 「魔法のように」とは、次を意味します。 コンパイラは、式の静的な型に基づいてコードを生成します。 さらなるマジックにより、ジェネリック配列を生成します。 new Array[T] のような式は(ここで T は型パラメータ)、new BoxedAnyArray[T] に変換しました。 BoxedAnyArray was a special wrapper class ,which changed its representation depending on the type of the concrete Java array to which it was cast. BoxedAnyArray は特別なラッパークラスで、具象 Java 配列の型に依存する表現をそれでキャストしたものへ変えます。この方法はたいていのプログラムで十分機能しました。 しかし、型テストと型キャストのある組み合わせに関して、未初期化配列のチェックに関しても、実装には「漏れ」が起きました。 予期しないパフォーマンスの低下も起こり得ました。 問題のいくつかは David MacIver[Mac08b] とMatt Malone[Mal09] によって述べられています。 ボックスされた配列も、共変コレクションと組み合わせると不健全でした。 まとめると、古い配列実装技術では解決が難しかったのです。なぜなら、漏れが起きる場所を特定することに大変な労力を強いられ、漏れを起こしやすい複雑な抽象化だからです。 解決策の探求 (Exploring the Solution Space) 配列に必要なマジック量を減らす明らかな方法は、2 つの表現を使うことです。 1 つは Java 配列に密接に対応するもので、もう一方は Scala のコレクション階層と一体となる部分を形づくります。暗黙の型変換を使って、2 つの表現を透過的に変換できます。 これは、David MacIver (と Stepan Koltsov の貢献)による配列リファクタリング提案の要点です [Mac08a]。 この提案の主な問題は、私の見るところ、これがプログラマーに使うべき配列種の選択を強いることです。 その選択は明快ではありません。 Java ライクな配列は速く、相互運用可能であるのに対して、Scala ネイティブの配列は、もっとよく洗練された配列操作群をサポートします。 このような選択があるとき、異なる決定に対しては異なるコンポーネントとライブラリを用いることが期待されますが、それは、非互換性と脆弱で複雑なコードをもたらします。 MacIver と Koltsov は、その軽減のためにいくつかのコンパイラマジックを導入します。 彼らは、引数として配列をとるメソッドを 2 つのオーバーロードされたバージョンに自動的に分けることを提案します。 1 つは Java 配列をとり、もう 1 つはジェネリックな Scala 配列をとるものです。 私はこれが、よりひどい配管工事問題をいくつか解くとは思いますが、しかし単に問題を隠して少しましになるだけであり、解決はしないと思います。 似ているが少し異なる観点を持つアイデアとして、Scala のコレクション階層に統合する暗黙の変換を用いて、ネイティブの配列を「ドレスアップ」するものがあります。 これは 2.8 以前の Scala 中で String から RichString への変換で用いた方式と似ています。 MacIver/Koltsov 提案との違いは、人は、Scala 中の RichString を滅多に参照しないのと同様に、通常はユーザーコード中で Scala ネイティブの配列を参照しないであろうということです。 人は、Java 配列に必要なメソッドとトレイトを加える、暗黙の型変換を当てにするだけでしょう。 特に、Scala 2.8 以前のバージョンにおいては、次のような直観的でないプロパティが使われました。 "abc".reverse.reverse == "abc" , yet "abc" != "abc".reverse.reverse ! ここでの問題は、reverse メソッドをクラス Seq から継承していたことであり、そこでは、それが別の Seq を返すと定義されていました。 文字列はシーケンスではありませんから、String 上で呼ばれたときに reverseが返すことのできるただ 1 つの適した型は RichString でした。 しかしそうすると Java から継承される String 上の equals メソッドは、String が RichString と等価であり得るとは認識しません。 2.8 コレクション (2.8 Collections) Scala 2.8 の新しい方式は、配列と文字列両方の問題を解決します。 それは、新しい 2.8 コレクションフレームワークをクリティカルに使い、Seq のようなコレクション・トレイトに、コレクションの表現にわたる抽象化を行う実装トレイトを関連づけます。 たとえば、トレイト Seq に加えて、次のトレイトがあります。 trait SeqLike[+Elem, +Repr] { ... } このトレイトは表現型 Repr でパラメータ化されています。 この表現型については、何も必要とされる前提がありません。; 特に、これは Seq のサブ型である必要はありません。 トレイト SeqLike 中の reverse のようなメソッドは、Seq ではなく表現型 Repr の値を返します。 Seq トレイトは、Reprパラメータを Seq にインスタンス化することで、SeqLike からそのすべての基本的操作を継承します。 trait Seq[+Elem] extends ... with SeqLike[Elem, Seq[Elem]] { ... } 基本トレイトと実装トレイトへの似たような分割手法を、Traversable、Iterable や Vecotr を含め、他のほとんどの種類のコレクションに適用します。 配列の統合 (Integrating Arrays) 我々は 2 つの暗黙の変換を使って、配列をこのコレクションフレームワークへ統合します。 最初の変換は、Array[T] を、型 VectorLike[T,Array[T]] のサブ型である、型 ArrayOps のオブジェクトへマップします。 この変換を使って、自然な型の配列については、すべてのシーケンス操作が利用できます。 特に、メソッドは、その処理結果として ArrayOps 値の代わりに配列を出力します。 なぜなら、これら暗黙の型変換の結果は非常に短命なので、今の VM はエスケープ解析を使ってそれらを完全に除去できるからです。 ですから、それら付加的なメソッドに関する呼び出しオーバーヘッドは実質的にゼロであることが期待できます。 ここまでは良いのです。 しかしもし配列を、それ上の 単なる Seq メソッドの呼び出しではないような、実際の Seq に変換する必要があるならどうでしょう? そのために、配列をパラメータにとり、WrappedArray に変換するもう 1 つの暗黙の型変換があります。 WrappedArrays は、与えられた Java 配列のすべてのベクトル操作を実装する、ミュータブルな Vectorsです。 WrappedArray と ArrayOps オブジェクトの違いは、reverse のようなメソッド類では明らかです。 WrappedArray 上の呼び出しでは reverse は再び WrappedArray を返しますが、しかし ArrayOps オブジェクト上の呼び出しでは Array を返します。 Array から WrappedArray への変換は不可逆です。 対をなす 2 つの暗黙の型変換により WrappedArray が Array へ変換されます。 WrappedArray と ArrayOps は共にトレイト ArrayLike 実装を継承します。 これは ArrayOps と WrappedArray 間のコード重複を避けるためです。 すべての操作は、共通の ArrayLike トレイトへまとめ入れられています。 あいまいさの回避 (Avoiding Ambiguities) このように、 Array から ArrayLike 値への 2 つの暗黙の型変換がありますが、どのように選び、どのように曖昧さを避ければよいのでしょうか? そのこつは、Scala 2.8 のオーバーロードと暗黙解決の一般化を利用することです。 以前は、もっぱらメソッドの引数型に基づき、最も特化(specific)したオーバーロードされたメソッド、あるいは暗黙の型変換が選択されていました。 There was an additional clause ,which said that the most specific method could not be defined in a proper superclass of any of the other alternatives. 最も特化したメソッドは他のいかなる代替物の固有(proper)のスーパークラス中で定義できない、と述べる付加的な節がありました。 この方式は Scala 2.8 では次の、より進歩的なものに置き換わりました。 オーバーロードされたメソッドあるいは暗黙の変換の、2 つの異なる適用可能な代替物を比較するとき、各メソッドは、より特化した引数を持つ場合は 1 ポイント獲得し、固有のサブクラス内で定義されている場合も 1 ポイント得ます。 これら 2 つの比較により、得点が多い方の代替物がもう 1 つに対して「勝ち」ます。 このことは特に、もし代替物が同一の引数型を持っていれば、サブクラスで定義されているものが勝つことを意味します。 このことを配列に適用すると、Array から ArrayOps への変換を標準的な Predef オブジェクト中に置き、Array から WrappedArray への変換を Predef から継承されているクラス LowPriorityImplicits 中に置くことで、Array から ArrayOps への変換を Array から WrappedArray への変換よりも優先できます。 このように、シーケンスメソッドの呼び出しは、常に ArrayOps への変換を起動します。 WrappedArray への変換は、配列をシーケンスに変換する必要があるときのみ起動されます。 String の統合 (Integrating Strings) 本質的に同じ方法を文字列に適用します。 2 つの暗黙の型変換があります。 1 つは、String から StringOps への変換であり、クラス String に役に立つメソッドを加えます。 2 つめは、String から WrappedString への変換であり、文字列をシーケンスに変換します。 ジェネリック配列の生成とマニフェスト (Generic Array Creation and Manifests) 以上でほとんど全てです。 唯一の残っている問題は、ジェネリック配列生成の実装方法です。 Java と異なり、Scala ではインスタンス生成 new Array[T] が可能です。 ここで T は型パラメータです。 Java のような統一的な配列表現が存在しないという事実の下、これをどのように実装できるでしょうか? その唯一の方法は、型 T を記述する実行時情報の追加を要求することです。 Scala 2.8 には、このためのマニフェストと呼ばれる新しいメカニズムがあります。 型 Manifest[T] のオブジェクト は、T についての完全な情報を提供します。マニフェスト値は通常、暗黙のパラメータとして渡されます。 そしてコンパイラは、静的にわかる型 T のおかげで、それらをどのように構築したらよいかがわかります。 ClassManifest と名付けられた、より弱い形もあります。 それは、必ずしもすべての引数型を知らずに、たんに型のトップレベルのクラスを知ることで、構築されます。 それは配列生成で必要とされる実行時情報の類です。 次は 1 つの例です。 0 から与えられた長さまでの数範囲に、与えられた関数 f を適用し、その結果からなる配列を出力する、メソッド tabulate (一覧)を考えてみます。 Scala 2.7 までは、tabulateを次のように書けました。 def tabulate[T](len Int, f Int = T) = { val xs = new Array[T](len) for (i - 0 until len) xs(i) = f(i) xs } Scala 2.8 では、これはもうできません。 なぜなら、Array[T] の正しい表現を生成するには実行時情報が必要だからです。 人が、メソッドへ暗黙のパラメータとして ClassManifest[T] を渡して、この情報を提供する必要があります。 def tabulate[T](len Int, f Int = T)(implicit m ClassManifest[T]) = { val xs = new Array[T](len) for (i - 0 until len) xs(i) = f(i) xs } この代わりに略記形式として、型パラメータ T 上のコンテキスト境界(*1)を使えます。与えてみます。 def tabulate[T ClassManifest](len Int, f Int = T) = { val xs = new Array[T](len) for (i - 0 until len) xs(i) = f(i) xs } (*1) 一般に、コンテキスト境界をもつ型パラメータは [T Bound]の形です。; これは、型 Bound[T] の暗黙のパラメータと一緒にプレーンな型パラメータ T へ展開されます。 Int あるいは String、List[T] のような型上で tabulate を呼ぶときは、Scala コンパイラは tabulate へ暗黙の引数として渡すマニフェストクラスを生成できます。 その他の型パラメータ上で tabulateを呼ぶときは、人が、他の暗黙のパラメータあるいはコンテキスト境界を使ってマニフェストクラスが必要とすることを伝える必要があります。 たとえば。 def tabTen[T ClassManifest](f Int = T) = tabulate(10, f) ボクシング方式を離れてマニフェストクラスへ向かうことは、上記の tabulate の最初のバージョン中にあるような、ジェネリック配列を生成する既存のコードを変えることになります。 必要な変更は通常、ある型パラメータにコンテキスト境界を追加するだけです。 クラス GenericArray (Class GenericArray) ジェネリックな配列生成の場合にマニフェストを加えることは、よくありません。 Scala 2.8 は GenericArray クラスで配列の代替バージョンを提供します。 このクラスは、パッケージ scala.collection.mutable 内で次のように定義されています。 class GenericArray[T](length Int) extends Vector[T] { val array Array[AnyRef] = new Array[AnyRef](length) ... // all vector operations defined in terms of `array } 標準的な配列と異なり、GenericArrays はマニフェストクラスなしで生成できます。 なぜなら、それら配列が同一の表現を持っているからです。 それらの全ての要素は、Java の Object[] 配列に対応する、Array[AnyRef] に記憶されます。 Scala コレクションライブラリへの GenericArray の追加は、プログラマに、標準的な配列か、あるいはジェネリック配列を選ぶことを要求します。 この選択は、しかし、容易に答えることができます。 要素型に対するマニフェストを容易に作れるときはいつでも、通常の配列を選ぶのがベターです。なぜなら、より速い傾向があり、よりコンパクトで、Java とより良い相互運用性があるからです。 マニフェストクラスを作成できないときだけ、GenericArray へ立ち戻って考えるべきです。 Scala の現在のコレクションフレームワーク中で、GenericArray が使われる唯一の場所は、Seq クラスの sortWith メソッドの中です。 xs.sortWith(f) の呼び出しは、そのレシーバ xs を最初に GenericArray に変換し、得られる配列を java.util.Arrays 中で定義された Java ソートメソッドに渡し、ソートされた配列を xs と同じ Seq の型へ戻し変換します。 配列への変換は sortWith の単なる実装詳細なので、シーケンスの要素型に対してマニフェストクラスを要求するのは合理的でないと感じました。 ですから GenericArray を選択しました。 まとめ (Conclusion) まとめると、新しい Scala コレクションフレームワークは配列や文字列の長期にわたる問題をいくつか解決します。 かなりの量のコンパイラマジックを除去し、前の実装で存在したいくつかの落とし穴を回避します。 それは、ライブラリとフレームワークの構築で一般に役に立つ、Scala 言語の 3 つの新しいフィーチャーに依存しています。 第一は、オーバーロードと暗黙の解決の一般化により、いくつかの暗黙の変換に優先順位を付けることが可能です。 第二は、マニフェストが型消去によって失われた型情報を実行時に提供します。 第三は、コンテキスト境界は、暗黙の引数のある形態に対する便利な略記表現となります。 これら 3 つの言語フィーチャーは、別のノートでより詳細に記述します。 参考文献 (References) [Mac08a] David MacIver. Refactoring scala.array. Pre-SIP (Scala Improvement Proposal), October 2008 . http//www.drmaciver.com/repos/scala-arrays/sip-arrays.xhtml . [Mac08b] David MacIver. Scala arrays. Blog, June 2008. http//www.drmaciver.com/2008/06/scala-arrays . [Mal09] Matt Malone. The mystery of the parameterized array. Blog, August 2009 . http//oldfashionedsoftware.com/2009/08/05/the-mystery-of-the-parameterized-array . SIDライブラリ ページ先頭
https://w.atwiki.jp/nanocoding/pages/45.html
s="abc\nefg\nhij"; Array.prototype.each = function(c) {var _a=[];for (var i=0; i this.length; ++i){_a[i]=c.call(this[i]);} return _a;}; a=s.split(/\n/).each(function(){return " +this+ " ;}) ss="["+a.join(",")+"]"
https://w.atwiki.jp/tmtbnc/pages/22.html
Array Object Array Ruby C Array rb_cArray Array.new rb_ary_new() Array.new(size) rb_ary_new2(len) rb_ary_new3(n, va_alist) rb_ary_new4(n, elts) Array#[] rb_ary_aref(argc, argv, ary) Array#[](nth) rb_ary_entry(ary, long offset) Array#[]=(nth, val) rb_ary_store(ary, long idx, val) Array#+ rb_ary_plus(x, y) Array# rb_ary_push(ary, item) Array# = rb_ary_cmp(ary1, ary2) Array#assoc rb_ary_assoc(ary, key) Array#at rb_ary_entry(ary, long offset) Array#clear rb_ary_clear(ary) Array#concat rb_ary_concat(x, y) Array#delete rb_ary_delete(ary, item) Array#delete_at rb_ary_delete_at(ary, long pos) Array#dup rb_ary_dup(ary) Array#each rb_ary_each(ary) Array#freeze rb_ary_freeze(ary) Array#include? rb_ary_includes(ary, item) Array#join rb_ary_join(ary, sep) Array#pop rb_ary_pop(ary) Array#rassoc rb_ary_rassoc(ary, value) Array#reverse! rb_ary_reverse(ary) Array#shift rb_ary_shift(ary) Array#slice rb_ary_aref(argc, argv, ary) Array#sort rb_ary_sort(ary) Array#sort! rb_ary_sort_bang(ary) Array#to_s rb_ary_to_s(ary) Array#unshift rb_ary_unshift(ary, item) obj.to_ary rb_ary_to_ary(obj) rb_values_at(obj, olen, argc, argv, func) static VALUE ary_alloc(klass) VALUE klass; { NEWOBJ(ary, struct RArray); OBJSETUP(ary, klass, T_ARRAY); ary- len = 0; ary- ptr = 0; ary- aux.capa = 0; return (VALUE)ary; } static VALUE ary_new(klass, len) VALUE klass; long len; { VALUE ary = ary_alloc(klass); if (len 0) { rb_raise(rb_eArgError, "negative array size (or size too big)"); } if (len ARY_MAX_SIZE) { rb_raise(rb_eArgError, "array size too big"); } if (len == 0) len++; RARRAY(ary)- ptr = ALLOC_N(VALUE, len); RARRAY(ary)- aux.capa = len; return ary; } VALUE rb_ary_new2(len) long len; { return ary_new(rb_cArray, len); } VALUE rb_ary_new() { return rb_ary_new2(ARY_DEFAULT_SIZE); } VALUE #ifdef HAVE_STDARG_PROTOTYPES rb_ary_new3(long n, ...) #else rb_ary_new3(n, va_alist) long n; va_dcl #endif { va_list ar; VALUE ary; long i; ary = rb_ary_new2(n); va_init_list(ar, n); for (i=0; i n; i++) { RARRAY(ary)- ptr[i] = va_arg(ar, VALUE); } va_end(ar); RARRAY(ary)- len = n; return ary; } VALUE rb_ary_new4(n, elts) long n; const VALUE *elts; { VALUE ary; ary = rb_ary_new2(n); if (n 0 elts) { MEMCPY(RARRAY(ary)- ptr, elts, VALUE, n); } /* This assignment to len will be moved to the above "if" block in Ruby 1.9 */ RARRAY(ary)- len = n; return ary; }
https://w.atwiki.jp/bg1wiki/pages/56.html
array.c /*------------------------------------------------------------------------------ * Title array * Project array * Source array.c * Author B.G * Group B.G * Created 14 47 2009/12/04 * Last Modified 14 47 2009/12/04 * ---------------------------------------------------------------------------*/ /* ヘッダファイルのインクルード */ #include stdio.h /* stdio.hのインクルード */ /* main関数 */ int main(void){ /* 変数・配列の宣言 */ int array[5]; /* 入力された5つの整数を格納する要素数5のint型配列array */ int i; /* ループ用int型変数i */ /* 値の入力を5回繰り返す */ for (i = 0; i 5; i++){ /* for文でscanfを5回呼ぶ */ printf("array[%d] ", i); /* i番目の値を入力 */ scanf("%d", array[i]); /* scanfで整数値を入力する(これを5回繰り返す) */ } /* 値の表示を5回繰り返す */ for (i = 0; i 5; i++){ /* for文でprintfを5回呼ぶ */ printf("array[%d] = %d\n", i, array[i]); /* i番目の値を表示 */ } /* プログラムの終了 */ return 0; }