約 1,833,386 件
https://w.atwiki.jp/mopsprogramming/pages/115.html
ここまで何回か述べてきたように、Mopsでの動的オブジェクト生成はハンドルによって行われ、ハンドルは、場合によっては、かえって不便なことがあります。そこで、ポインタを用いたヒープオブジェクトのリストのクラスを自分で作ってみようというわけです。GUIオブジェクト、主としてマルチウィンドウの登録用に使えると思います。 前提の話ですが、MopsにはPtrListというクラスがあります。これはその名に期待される通り、ポインタのリストで、事後的に要素を自由に追加削除できます。ではそのまま使えばいいかというと、残念ながらそうはいきません。実は、このリストはヒープオブジェクトを前提としたものではありません。むしろ、静的なオブジェクトのベースアドレスをリストにして、一括して扱う目的のものといえます。それでも、ポインタのリストを操作するという機構を備えているので、これを継承して、サブクラスで動的オブジェクトをあつかうメソッドを追加する方法が考えられます。これがもっとも合理的なやり方でしょう。ここでは、その方法を説明します。一応、実際にサンプルを書いてみました。最適なやり方というつもりはありませんが、問題なく動くと思います。いくつか、おまけもつけましたが、シリアライズ(オブジェクトをファイルなどに書き出して永続化する方法)の機能はつけませんでした。サンプルコードはここからダウンロードできます。この中身について、主要な部分をここで説明しようと思います。全部は引用しませんので、全貌についてはサンプルをダウンロードして合わせてご参照ください。コードにあまりコメントはありません。すみません。ブラウザで見たい方はこちら。かんたんでしょ(^_^) PtrListクラスは、Ptrクラスと(PHLIST)クラスを、この順に二重継承しています。後者は、おそらくPointerとHandleのリスト、という意味で、それ用にカスタマイズされたSEQUENCEクラスのサブクラスです。このPtrListクラスを継承して、ObjPtrListというクラス名にしました。 メッセージは、できるだけHandleListクラスと互換性があるようにすることを目指します。 最初の難関は新しいオブジェクトを生成するところです。NewObj メソッドの定義をご覧下さい。 m newobj { ^CLASS -- } nilp add super ^CLASS CL LEN Obj_hdr_Length + new self 0 get self ! ^CLASS obj self make_obj ;m 引数であるClassXTはnamed parameterに格納しておきます。インデックス付きオブジェクトを追加するときの懸念が不要になります。PtrListに新しい項目を追加するメッセージは、ポインタを引数にしてAdd です。そこで、とりあえず、nilPをAdd して、要素を追加しておきます。 それから、オブジェクトのサイズ+オブジェクトのヘッダデータ長(obj_hdr_length)分の大きさのヒープ領域を獲得して、そのポインタを格納します。オブジェクトのサイズは、ワード"CL LEN"に(オプショナルにインデックスオブジェクトの要素数と)ClassXTを与えて得られます。ヒープ領域の確保にはPtrクラスのNew メソッドを使います。ヘッダデータを追加する前に、最初の4バイト分をクリアしておく必要があります。そして、オブジェクトの(インデックスオブジェクトには要素数と)classXT、および、実際にオブジェクトデータが始まる部分のアドレス(ヒープ領域のはじめからヘッダの長さの分取り除いたところ)を引数にして,ワードmake_objを呼びます。これで、確保したヒープ領域にオブジェクトのヘッダデータが記録されるとともに、オブジェクトが初期化されます。ヒープオブジェクトを生成するにはこのようにすればよいことは、ObjHandleクラスのメソッド定義を参照すれば明らかです。 オブジェクトのベースアドレスは、いつも、ヒープ領域の頭からヘッダデータの分だけ後方にずれたところにあります。ちなみに、PowerMopsでのヘッダデータの長さは、現時点では12バイトです。ですから、オブジェクトのベースアドレスを採るときは、いつもポインタ値に12足した値を返すことになります。ですから、上でも利用されているObj メソッドは次のように定義されています。 m obj inline{ ^base @ obj_hdr_length + } ;m このメソッドは頻繁に呼び出されるであろうという想定の下、インライン定義をしています。呼び出しをコンパイルするのでなく、呼び出し部分にこのコード内容が直接書き込まれる、という意味らしいです。あまり効果はないかもしれません。 上のobj メソッドでは、このリストクラスでは、^BASEもSELFの、第一次的にはリスト中の現行(current)要素のオブジェクトベースアドレスを意味しているということを利用しています。つまり、現行要素が変わるたびに、これらが意味するもの(値も)変わるわけです。ここでは^baseは現行要素をなすポインタオブジェクトのベースアドレスですから、そこには、ヒープ領域を指し示すポインタ、つまりその頭のメモリーアドレスが格納されているわけです。そこから、ヘッダデータ分をとばしたところがこのヒープオブジェクトのベースアドレス、というわけです。 もうひとつ、説明しておきたいのは、First? メソッドとNext? メソッドをオーバーライドしている点です。これはBEGIN each ... WHILE REPEATループの挙動を変えるのが目的です。 m First? ( -- ^obj T | F ) First? super NIF false EXIT THEN obj_hdr_length + true ;m m next? ( -- ^obj T | F ) next? super NIF false EXIT THEN obj_hdr_length + true ;m もう少し特定すれば、First? とNext は、(PHLIST)クラスのeach メソッドの定義の中で、Late Bindで用いられているのです。each は、はじめはFirst? を送り、次からはリストが尽きるまでNext? を送ります。名前からわかる通り、First はリストの最初の要素(0番)をセレクトし、Next? は、次の要素をセレクトしていくわけです。これらのメソッドは、また、単にセレクトするだけでなく、対応する要素が存在しなかった場合にはFalseを返し、存在する場合には、"その要素に関わる値"とTrueの二つの値を返します。この真偽値をWHILEが受けてループを制御するわけです。 (PHLIST)クラスでは、"要素に関わる値"としては、格納されているポインタが返されるようになっています。PtrListクラスでもオーバーライドはなく、そのまま継承されています。ところが、そうなると、いま作ろうとしているObjPtrListクラスからみると、この値はヒープ領域そのもののポインタになってしまい、オブジェクトのアドレスにはなりません。いまリスト要素として重要なのは、そこに格納されているオブジェクトの方でしょう。そういうわけで、オブジェクトのベースアドレスが取れるように変形したわけです。 上の変形は、デバッグ用のメソッドであるPRINTALL とDUMPALL の定義に役立っています。これらは、PtrListクラスにはなく、HandleListクラスを参考に定義したものです。 m printAll nil? theList IF ." (not open) " EXIT THEN get pos BEGIN each self WHILE print ** cr REPEAT (SEL) self ;m m dumpAll nil? theList IF ." (not open) " EXIT THEN dump super cr ." current " current self dup . cr ." elements " cr BEGIN each self WHILE dump ** cr REPEAT select self ;m HandleListクラスは、" Mops source PPC source pStruct"というファイルに(もちろん" "はフォルダ階層を意味していて、Mopsの最上位フォルダの中から書いてあります。この期に及んで念のため(^^;;)。)あります。ご参照ください。 関連項目: 動的オブジェクトリストクラスの自作2 動的オブジェクトのリスト トップページへ 目次
https://w.atwiki.jp/pakemon/pages/606.html
【034】クレイモア回収 ◆セルバ・デ・ラ・ムエルテ / 崖下 クレイモアは背面に近付くと回収できます。 敵兵などはいないので落ち着いて回収しよう。(計8個) (SINGLE限定。クレイモア地雷が起爆するとミッション失敗。制限時間05 00 、クレイモア地雷回収ごとに+00 10 ) 【ミッションリザルト】 VERSUS OPSにて「採掘場居住区(夜)」が使用可能になります。
https://w.atwiki.jp/exo1s1nb/pages/13.html
人気商品一覧 @wikiのwikiモードでは #price_list(カテゴリ名) と入力することで、あるカテゴリの売れ筋商品のリストを表示することができます。 カテゴリには以下のキーワードがご利用できます。 キーワード 表示される内容 ps3 PlayStation3 ps2 PlayStation3 psp PSP wii Wii xbox XBOX nds Nintendo DS desctop-pc デスクトップパソコン note-pc ノートパソコン mp3player デジタルオーディオプレイヤー kaden 家電 aircon エアコン camera カメラ game-toy ゲーム・おもちゃ全般 all 指定無し 空白の場合はランダムな商品が表示されます。 ※このプラグインは価格比較サイト@PRICEのデータを利用しています。 たとえば、 #price_list(game-toy) と入力すると以下のように表示されます。 ゲーム・おもちゃ全般の売れ筋商品 #price_list ノートパソコンの売れ筋商品 #price_list 人気商品リスト #price_list
https://w.atwiki.jp/popsifs/
POPSIFS本部へようこそ このサイトはペン回しを愛する人がペン回しについて情報を更新していくものです。 menu トップページ 初めての方へ ペン回しとは comunity pen trick spinner words movies inserts freestyle penspinningnews 新技、新ペン開発の会 週間pasb pasbchat リクエスト、Q and A
https://w.atwiki.jp/mopsprogramming/pages/29.html
ループ 【以下【】の中は訳者が付け足したものです。】 コンピュータープログラムには、しばしば、特定の演算操作を一定回数繰り返すことが必要となります。 例えば、スタック上の10個の数の和を見つけることは、普通は、引き続く9個のステートメントが用いられるでしょう。 プログラマーの考え方に対して見れば、これはプログラムを何段階か必要以上に長くしてしまいます。同じステートメントを長々と続けてプログラムのサイズを大きくしてしまうようなことなしに、加法演算を作業に必要なだけの回数繰り返す簡便な方法があればいいところです。 ここで登場するのがloop構成です。 ループ(loop【環路?】)はあなたのプログラム内に、初めと終わりのある一種のメリーゴーランドを設定します。 ループの終わりには、そのループの始めに"巻き戻る(loop back)"ようにとプログラムに告げる命令があります。 出発点から終わりまでの全てのステートメントが、プログラムの実行がループ内を通る度毎に繰り返されます。 Mopsは二つの主要なループのカテゴリーをもっています:確定ループと不定ループです。 その名前が示唆するように、各カテゴリーは、ループの循環をいつやめるのかを判定する方法が異なります。 確定ループはプログラムが特定した回数しか繰り返されません。;他方、不定ループは一定の条件に適うまで(いつまでも)繰り返されます。 各ループをもうすこし詳しく見てみましょう。 確定ループ 上で述べた10個の数の加法を考えましょう。足し算が起る前にスタック上に正確に十個の数値があることが予めわかっているのですから、スタック上に9個の足し算を実行する確定ループを使うことができるでしょう。 Mopsの確定ループは、DO...LOOPステートメントから成ります。これはDOが実行される前にスタック上に二つの数値があることを期待します。その二つの数値はそのDO...LOOPステートメントが為すべき繰り返しの回数を表現します。;二番目の値(スタックの一番上)は、ループが始まる前の【ループ指標の】増分を示します。 DO ... LOOP ( n1 n2 -- ) ‘n2’ はDO と LOOPの間の演算操作を実行された後、毎回増加します。; ‘n2’が‘n1’に等しくなったならループを抜けます。 ループはコンパイルされたステートメントの中でしか働かないので、その動作の仕方を見るにはコロン定義の中に置く必要があります。 足し算を9回繰り返し実行することによってスタックの10個の数値を加算する新しいワードを定義しましょう。: ADDTEN ( n1 ... n10 -- sum ) 9 0 DO + LOOP . cr ; 実行の間、このDO...LOOPは、ループの各回ごとに0から9まで数え上げます。9回目の巡回でループは止まります。; スタックの頂上(和)が表示され、改行が実行されます。 パラメタースタックが足し算される数の全体を保管するのに用いられているのなら、Mopsはどこでループカウンターをきちんと処理しているのかと不思議に思うかもしれません。その答えは、指標付け(indexing)と呼ばれる強力な機能に関連します。これは、Mopsについて学べば学ぶほど、重要な役割を担うものとなってくるでしょう。 上の例でDO...LOOP構成の前に9と0を入力したとき、これら二つの数はあなたの知らないうちにメモリーの別の部分に自動的に移されるのです。あなたが打ち込んだ最初の数(9)は、limit(境界)と呼ばれます。というのは、この数はそのループの内容が実行されるべき回数の境界値を表しているからです。 二番目の数(0)は指標(index)と呼ばれます。この数値は、ループを通った各回毎に1だけ増やされます。ですから、上の例で最初にDO...LOOP構成を通過したときには、指標は1に増えています。;次の回には2、等々、となるわけです。(LOOPにおいて)指標が増加される度毎に、指標と境界の値が等しいかどうかチェックが行われます。 もし等しければ、DO...LOOP構成は、いまや先に進むべきときであり、再度の繰り返しのために(DOへと)巻き戻されるべきではない、ということを知ります。 この種の指標付けの面白いところは、ループの実行中に指標値をカウンターとして利用できることです。境界値と指標値をあなたがループ内で演算操作するために必要な整数とすることによって、ループをまわる各回ごとに指標値をパラメタースタック上にコピーし、その数値を、計算や、図像を配置する点、かけ算の因数などに利用することができるのです。 指標値をパラメタースタックにコピーするMopsワードは"I"【英文字のアイ】です。: I ( -- n ) 現時点の指標値をパラメタースタックにコピーします。 このワードは指標値をコピーするだけであることに注意してください。; 指標値そのものに影響を与えることはありません。いくつかの例証をみてみましょう。 ワードFIVECOUNTを定義します。これは101 から 105 までの続き数値を表示します。: FIVECOUNT 106 101 DO i . LOOP cr ; 境界は106に設定されていることに注意してください。指標は実行がLOOPに到達したときに増やされることに気をつけてください。初回の間は指標は101だったので、ワードIはその指標をパラメタースタックにコピーしました。; . コマンドが続いてそれをスクリーン上に表示しました。5回目の実行のときは、指標は105でした。実行がLOOPに至ったとき、指標は106に増やされました。この時点でいまや指標は境界値に等しくなったので、実行はこのループを抜け出したのです。 同じように、指標値は、実行前にパラメタースタック上に渡された数値と演算を実行するのに利用することができます。次の定義を見てみましょう。: TIMESTABLES ( n -- ) 13 1 DO dup i * . LOOP drop cr ; 【「予めスタックで渡された」という本文に合わせて、スタックを使うコードにしました。原文では名前付き引数を用いています。】 ‘5 timestables’と打ち込めば、1から12まで増えていく指標値にその都度5をかけて打ち出すループを12回実行します。 DO...LOOP構成の中に、前に述べた条件決定構造を含む、あらゆる種類のステートメントを置くことができます。 記述を簡潔にするためにDO...LOOP構成を使いたいけれども、LOOPが自動的に実行する1の加算とは異なる指標加算量がほしいということもあるでしょう(LOOPのときは1増やすことしかできません)。このような状況では、オプションのループ終了ワードである+LOOPを使うことができます。+LOOPの前に数値をおけば、それが何であっても、DO...LOOPが指標を調整するのに用いる加算量となります。 ループの指標を減らしていきたいときには、負の数値も用いることができます。 +LOOP ( n -- ) LOOPの代用ワード。ループの指標を‘n’だけ増やし、指標が境界に達していなければ一番近いDOまで実行を戻します。 カウントダウンを+LOOPを使って管理する方法を示しておきます。: COUNTDOWN 1 10 DO i . cr -1 +LOOP ." Ignition...Liftoff!" cr ; この場合においてはループは逆方向にカウントしますから、境界は1、指標は10です。 ループを通る各回ごとに、指標は-1の分減らされます。このプログラムは境界値1も印字することに注意してください。指標がカウントダウンされて境界値に等しくなったときには、ループは継続され、指標が境界マイナス1になるまで止まりません。これは指標が増えていっているときと状況が違います(後者では指標が境界に等しいところで止まります)。 これを考えるときに一番良い方法は、「境界」と「境界引く1」の間に"フェンス"があるのだ、と考えることです。 どちららの方向からでも指標値がそのフェンスを越えたときにループは止まるのです。 これは、指標の増大によってループの走行中に符号が変わるとき、つまり、負から正になるときでも成り立ちます。 【ちなみに+LOOPの場合、指標のステップを巡回毎に変化させることもできます。しかし、途中でステップの符号を変えること(指標値を増やしたり減らしたりすること)はできないようです。】 入れ子状ループ 一つより多いDO...LOOPが同時に走行することが必要になることもあります。IF...THEN構成の場合と同じように、DO...LOOPも互いに入れ子にすることができます。 気をつけるべきことは、一つの定義の中で各DOに対応するLOOP(または+LOOP)をそれぞれひとつ提供しなければならないということだけです。 NESTEDLOOP 1 10 DO ." Loop " i . cr 4 0 DO ." Nested LOOP " i . cr LOOP -1 +LOOP cr ; NESTEDLOOPと打ち込んで、外側のループの各1巡回が終了するまでに、内側のループがどのように繰り返されるのかを観察してください。 入れ子になった内側のループで、外側のループにアクセスしたいときには、ちょうどIと同じように、外側のループの現在の指標をパラメタースタックにコピーするワードがあります。それは、Jです。 J ( -- n ) 入れ子になったDO...LOOP構成の中で、その一つ外側のループの現在の指標値をパラメタースタックにコピーします。 言い換えれば、Jは、ちょうど一つ外の現在のDO...LOOP構成の指標を見つけて、その数値をパラメタースタックにコピーするのです。 NESTEDLOOP2 1 10 DO ." Loop " i . cr 4 0 DO ." Loop " i . ." within Loop " j . cr LOOP -1 +LOOP cr ; 注意:もし内側のループを別定義としてファクターしたならばJを使うことはできません。 — 正しい値を得ることはできないでしょう。 Jは現在の定義内の入れ子のループでしか働きません。 ループの中断 状況によっては、通常の終了前にDO...LOOPを抜け出す必要があることもあり得ます — おそらく特別な事情が起ったためでしょう。この目的のためにはワードLEAVEが利用できます。 LEAVE ( -- ) 現在のループを直ちに脱出します。 ここに、適当に修正したカウントダウンの例をまた挙げておきます。 COUNTDOWN2 1 10 DO i . cr i 7 = IF ." Aborted!!" cr LEAVE THEN -1 +LOOP ; "Ignition...Liftoff!"メッセージは取り除かなければなりませんでした。というのは、 そうしないとカウントダウンが中止された後に、そのメッセージが現れてしまうからです。 (これは実際望ましい結果ではありません。) これをもっとうまく処理する方法は、少し後で説明します。 不定ループ 不定ループはもうひとつの種類のループでMopsプログラムにおいてしばしば利用されます。 その名が示唆するように、不定ループは一定の条件が存在するまで巡回し続けます。 一回だけまわるということも、条件が起るのを待ち続けて何千回もまわるということもあります(そして許されるなら無限に続きます)。 Mopsでは、その条件とはスタックのトップにフラグがあることです。 BEGIN ( -- ) 不定ループの先頭を標します。 UNTIL ( n -- ) "n"が非ゼロ(true)ならば不定ループを抜けます; そうでなければBEGINの直後に実行を戻します。 BEGIN...UNTILによる不定ループは次のように使うことができます。: BEGIN xxx UNTIL (複数の)演算xxxは、UNTILのためにTRUEフラグがスタック上に置かれるまで(確定的な終わりはなく)繰り返し実行されます。 この構成の便利な亜種としてワードNUNTILを用いるものがあります。: NUNTIL( n -- ) UNTILの代用ワード。"n"がゼロ(FALSE)のときに不定ループを抜けます; そうでない場合はBEGINの直後に実行を戻します。 前の例の形では、UNTILの代わりにこれを用います。 BEGIN xxx NUNTIL 前と同様、演算xxxは繰り返し実行されますが、今回は、FALSEフラグがおかれるまでループは止まりません。 BEGIN...UNTIL構成の使い方の例を挙げます。 下の場合には、不定ループはあなたがキーボードで小文字の‘a’を入力するのを待ちます。 KEYオペレーションは、あなたがキーを押すまで、プログラムを停止させます。 そして、キーが押されたなら、押された文字に同値な標準的なコード番号(ASCIIと呼ばれます。— あとで説明します。)をスタックに押し込みます。スタック上の数値が十進で97(小文字の‘a’に対応するASCIIコード番号です)であるときには、スタック上に-1 (TRUEフラグ)がおかれ、ループが終了します。 それ以外の場合はスタックにはFALSEフラグがおかれ、実行はループの始めに戻ります。 BEGINTEST BEGIN key 97 = UNTIL ." Loop broken." cr ; さて、BEGINTESTと打ち込んで、キーボード上の色々な文字を押してみてください。 小文字の‘a’を押すまで、このブログラムは循環しつづけます。 実はBEGINは別種の不定ループの開始点にもなっています。 新しいワードは、次の通りです。: REPEAT ( -- ) 実行を無条件にBEGINの直後に戻します。 WHILE ( n -- ) ‘n’が非ゼロ(TRUE)である限り、ループ内の実行を続けます。 これら全部で三つのワードを組み合わせたものは、BEGIN...WHILE...REPEATループと呼ばれます。 当たり前のようですが、次のように使われます。: BEGIN xxx WHILE yyy REPEAT このステートメントは、ループを経由する毎に毎回xxxを実行しますが、実行がWHILEに達したときに、非ゼロの数値(TRUE) がスタックのトップにある場合にのみyyyは実行されます。もしも、WHILEでのフラグがゼロならば、ループを抜け、yyyが再び実行されることはありません。 ここでも、WHILEの変種としてNWHILEがあります。これは、スタック上のフラグがゼロ(FALSE)の場合にのみ、ループを継続します。 NWHILE ( n -- ) WHILEの代用ワード。‘n’がゼロ(FALSE)である限りにおいてのみBEGIN...REPEATループ内の実行を継続します。 上の新しい構成の働きを示すように、BEGINTESTを変形したのが次の例です。: BEGINTEST2 ." Type a lower-case letter a , please." cr BEGIN key 97 = NWHILE ." Wrong key!" cr REPEAT ." Thank you. Loop broken." cr ; 上の例は、小文字の‘a’を打つようにというユーザーへのメッセージから始まります。 前のBEGINTESTとは違って、このバージョンでは、間違ったキーを押したときに、ユーザーにフィードバックを提供しています。 正しいキーを押した場合には、実行はNWHILE以降を続けてエラーメッセージをプリントすることはありません。 というのは、=がTRUEフラグをスタックに残す(ユーザーが押したキーのASCIIコードナンバーが97に等しかったことを示します)ので、実行はこのループから完全に抜けて定義の最後にある最後のメッセージの印字へと続くからです。 EXIT 必ずしもループに関連するものではないのですが、ここで非常に便利なオペレーションであるEXITに言及するのがよいでしょう。 EXIT ( -- ) 現在のワード(またはメソッド)の実行を終了します。 LEAVEと違い、EXITはそこの定義を完全に抜けます。 初めのBEGINTESTをEXITを用いて書き換えた例です: BEGINTEST BEGIN key 97 = IF EXIT THEN key 98 = UNTIL ; この定義は、あなたが‘a’ (ASCIIコードナンバー97)か‘b’(ASCIIコードナンバー98)を押すまで走り続けます。次のように書くこともできます。: BEGINTEST BEGIN key 97 = IF EXIT THEN key 98 = IF EXIT THEN AGAIN ; そうです。BEGINを使うループはもう一つあります。こっそり使ってしまいました。 AGAIN ( -- ) BEGINの直後に実行を戻します。 もちろん、BEGIN...AGAINループを書いたならば、このループはEXITのような 何か特別な方法で終わらせなければなりません。 EXITをDO...LOOP内に書くときには、もうひとつ、忘れずにしなければならないことがあります。 — Mopsは(他のForthでも同じですが)DO...LOOPを実行する際にはいくつかの追加的情報を保存しています。 DO...LOOPを何か通常と違う方法で(つまり、LOOP、+LOOPまたはLEAVEを経ずして)終了させる場合は、その情報を取り除かなければなりません。そのために用いられるワードはUNLOOPです。 UNLOOP ( -- ) DO...LOOPから脱出する場合にリターンスタックから全てのループ情報を安全に取り除きます。 これをまたカウントダウンで例示しましょう。: COUNTDOWN3 1 10 DO i . cr i 7 = IF ." Aborted!!" cr UNLOOP EXIT THEN -1 +LOOP ." Ignition...Liftoff!" cr ; また"Ignition...Liftoff!"というメッセージを復活させることができたことにお気づきでしょう。しかし、ループがUNLOOPとEXITで中断されたときには、これらメッセージは全く素通りされるのです。 注意:ループをデザインするときに意図せずして無限ループをすべり込ませてしまう可能性があります。これは絶対に避けてください!不定ループのスタック演算を慎重にチェックして、あなた、または、あなたのプログラムがループを終了させることができるような条件が少なくとも一つはいつもあるようにしてください。 そうしないと、あなたのプログラムは"閉じ籠って"しまったように見え、キーボードからの入力にも無反応になる可能性があります。もしそうなってしまったら、Mopsアプリケーションを強制終了しなければならないでしょう。 チュートリアル目次へ 前へ レッスン12 次へ レッスン14
https://w.atwiki.jp/pk6ss62/pages/3.html
更新履歴 取得中です。
https://w.atwiki.jp/tcgexplorer/pages/64.html
解凍すると TcgExplorer.exe zlib1.dll \pluginフォルダ の3つが作成されます。あとはプラグインフォルダにTCGデータをぶち込んで起動すれば動くはず。 メニューにマニュアルっっぽいのがある。 ダウンロード ftpになぜかアップできないのでリンク変更 http //www38.atwiki.jp/tcgexplorer?cmd=upload&act=open&pageid=64&file=TcgExplorer20111209.zip 変更箇所 カードイメージがデスクトップから見切れる場合、カード表示位置を変更するようにしました。 修正箇所 既知の問題 デッキタブの切り替えでエラーメッセージが出る。描画関係?
https://w.atwiki.jp/starbreak/pages/149.html
Hotfoot 着弾ダメージ 爆発ダメージ 加速度 炎の数 5-25 3-7 40 20 Burner 着弾ダメージ 爆発ダメージ 加速度 炎の数 10-30 6-14 40 20 Triad 着弾ダメージ 爆発ダメージ 加速度 ミサイル数 8-25 30-70 40 3 Swarmer 着弾ダメージ 爆発ダメージ 加速度 ミサイル数 10-30 40-80 40 5 Locust 着弾ダメージ 爆発ダメージ 加速度 ミサイル数 15-45 50-100 40 7 コメントは最新10件を表示しています 全コメント 名前
https://w.atwiki.jp/mopsprogramming/pages/26.html
新しいワードを定義する 【以下【】の中は訳者が付け足したものです。】 前に述べたように、プログラムの構築中にMops辞書にワードを追加することができます。実際、およそMopsプログラミングとは、それをすることなのです。あなたのプログラム内のクラス名、メソッド名、オブジェクト名は、全て、Mopsワードの辞書の一部となります。新たなMopsワードを定義することはまた、あなたが、いくつかの(あるいは多くの)他のForthステートメントの代わりとなる一つの短く単純なワードを定義することによって、自分のルーチンないしサブルーチンを書くということでもあります。このことにより、あなたはプログラムを多くの小さな扱いやすい断片いファクターすることができます。これは、重要なプログラミング上の概念でありテクニックです。 最初の定義実習では、足し算の問題について記号を扱う新ワードを定義することにしましょう。新ワードは "ADD" です。もっとも、Mopsの辞書にないワードなら何を選んでもいいのですが、 注意:現実には、Mops辞書に既に存在している名前のワード(クラスを含む)を定義することを妨げるものは何もありません。実際、これをしてもMopsが不平を言わないことに気づくでしょう!これは、意図的にMopsのデザインの一部とされたものですが、一般的には、あなたがそれによって何か達成したい良いアイディアがある場合でなければ、辞書内にすでにあるワードを再定義することは、良い考えではありません。 新しく定義したいワードの名前が、既に辞書内にないかどうかを確かめるためのもっとも安全な方法は、あなたが調べたい名前に対して、"ティック"コマンドを適用することです。Mopsでは、大抵のForthの場合と同じように、ティックは、アポストロフ( )です。アポストロフ、半角空白、試しているワード名、と打ち込むと、Mopsは辞書内を検索して、そのワードが存在していないか調べます。そのワードが辞書内にあれば、ティックはスタック上に、ある数値を残します。これは、このワードの定義のメモリー内での場所を指します。しかし、そのワードが辞書にない場合には、‘undefined word’ メッセージがスクリーン上に現れます。この場合には、 それは、あなたは晴れてその名前でワードを定義してもよいということを意味します。 window . 5241310 twindow . Error # -13 undefined word twind . ^ Current object TW class MLTEFWIND 新しいMopsワード定義するには、コロン( )、半角空白、新しいワードの名前、一つ以上の空白かタブ、値および/または定義されてるワードを用いたときに実行されるべきコマンドの系列、そして最後にセミコロン(;)をタイプして、新しいワードの定義の終了を示します。この種のMopsの定義は、もっともですが、コロン定義と呼ばれます。( CLASS と M はこれとは別の、もっと特別な目的の定義ワードであることに注意してください。) 新しいワード ADDを定義している例をあげましょう。これは、スタック上の二つの数値の足し算を実行し、結果を表示した後、Mopsプロンプトを次の行の左端に動かします。(ここでは、完備性のためと好ましい習慣の例として示すために、スタックコメントを付けておきます。;これを打ち込むことは必要ではありません。)あなたが打ち込む各行はENTERキーで終わらなければならないことを思い出してください。: ADD ( n1 n2 -- ) + . cr ; + 演算はスタック上に二つの数値がみつけられることを期待しているので、あなたの新ワードを利用するには、二つの数値を打ち込み(これはスタック上に行きます)、それから新ワードを打ち込むことになります。: 2 6 add 8 | リターンスタック 既に見たように、Mopsプログラムは、基本的にはワードとオブジェクトに送られるメッセージ(これがメソッドの実行を引き起します)の系列から成っています。これらのワードとメソッドの定義は、たくさんの他のワードやメッセージを含むことができます。 Mopsが一つのワードまたはメソッドを実行するとき起らなければ成らないことを考えるならば、それは他のワードやメソッドのところに行ってそれらを実行し、それからもと居たところに戻ってくる必要がある、ということに気付くでしょう。この戻るべき場所に何らかの方法で印をつけておく必要があります。これを操作する方法は、第二のスタックを用います。働きはパラメタースタックと似ていますが、リターンスタックと呼ばれます。Mopsは、どこか別の場所で何かを実行しなければ行けないときには、現在の位置をアドレスとしてリターンスタックに保存します。その別の場所において、またどこか別の場所に行かなければならないときには、同じように新しい【現在の】アドレスをリターンスタックに押し込みます。このようにして、ワードやメソッドは他のワードやメソッドを呼び出すことができ、今度はそれらがまた同じようにすることができ、深いところまで降りることができます。 そして、第二のスタックを利用することによって、これらリターンスタック上のリターンアドレス【回帰点アドレス】は、パラメタースタック上のアイテムの邪魔をすることはありません。 注意:Mopsはリターンスタックに、リターンアドレス以外にも、いくつかのその他のアイテムを置きますし、あなたも置くことができます。 しかし、適切にファクターされたオブジェクト指向プログラムでは、一般にリターンスタックを直接に操作する必要はありません。ですから、その操作のやり方は、このチュートリアルではカバーされていません。 通常は、リターンスタックで何が起っているのかについて気にする必要はありません。しかし、エラーが起ったときには、それが起ったときプログラムが何を実行していたのか知ることは、通常、非常に有用です。しかし、Mopsも、上のエラーメッセージで見たように、エラーを報告することによってあなたを助けようとするでしょう。もう一度見てみましょう。: twindow . Error # -13 undefined word twind . ^ Current object TW class MLTEWIND エラーメッセージの最初の行は、起ったエラーの性質を教えています。この場合、未定義ワードエラーでした。二行目は、このエラーを生じたプログラムステートメントを示しています。三行目のキャレット(^)は、そのプログラムステートメント(二行目に表示されています)の中で、Mopsがエラーを発見した場所を指しています。四行目はそこでエラーが起ったオブジェクト(およびそのクラス)を引用しています。この場合は、オブジェクトTW(‘system source’にあるソースファイル‘zFrontEnd’にあります)で、Mopsウィンドウの解釈実行の一部を構成しています。 私達は、エラーが起ったメソッドの名前を表示することはできません。というのは、メソッド名は読める形では格納されていないからです。しかし、それらのワードが起ったプログラムのステートメントを見るだけで、普通は、エラーの場所を突き止めるのに充分です。 名前付き入力引数 Mopsは、パラメタースタック上にデータを格納し、取り出す順序に関する配慮の必要を軽減することによって、物事を少し容易にしてくれます。新しいMopsワードを定義するときにはいつも、Mopsは、そのワードに渡される引数に名前をつけることを許しています。その後には、スタック、ないしデータの順序に気をつかう必要がありません。演算のためにデータが必要なときは、あなたがそれに付けた名前で、データを参照するだけです。 例として、レッスン 3で述べたかけ算-そして-割り算-問題を使います。思い起こせば、演算は次のように表現されました。: 5 * 12 * 50 ------------- 40 これを名前付き入力引数なしで計算することが、前のレッスンでしたことでした。分子の三つの数をかけ算し、それから、割り算の前に分母をスタックに置かなければなりませんでした。名前付き入力引数で計算の実行がどのように単純化されるかを見てみましょう。: FORMULA { denom n1 n2 n3 -- solution } n1 n2 n3 * * denom / ; 名前付き入力引数の魔法は、中括弧({ と }。カーリーブラケット【捩れ括弧?】ともいいます)の中に置きます。シンタックスは意図してスタックコメントに似せてあります。というのは、それは実際一種のスタック記述だからです。ですからこの場合、ワード FORMULA が実行されるときにはいつも、次のようになります。: 40 5 12 50 formula . 75 最初に起ることは、値がスタックから取られ(取り除かれ)、専用の記憶領域に置かれます。そこでは、中括弧内の名前に、スタック上に置かれたのと同じ順序で値が結びつけられています。ひとたびそれが起れば、その順序はもう重要ではありません。計算において値を満たすのには、その名前が用いられるのです。【ここだけ読むと、名前付き入力引数は専用フレームに格納されるかのように読めますが、PowerMopsでは実際には、すべてレジスター変数です。また利用できるレジスタの個数に限りがあるため、名前付き引数は、次に説明される局所変数と会わせて、最大で9個までという上限があります。】 しかし、‘solution’パラメターは、実際にはコメントであることに注意してください。 "--" と "}" の間にあるものは、みな、コメントとみなされます。このコメント領域は、通常のスタックコメントとまさに同じように、あなたの定義がスタック上に残すものを示すために用いるべきです。 あなたが名前付き入力引数に割り当てた名前と値は、そのコロン定義内でのみ有効であることを心に留めておく事は重要です。別のコロン定義で、同じ、あるいは違う値について、同じ名前を用いることには何の障害もありません。 名前付き入力引数は、コロン定義の中で値を調整する事ができる上で、非常に強力な方法です。例えば、次の式を考えてみましょう。: a^2 + b^2 コンピュータは一回に一つの自乗しか計算できないのですから、二つの自乗を足し算できるようになる前に、二番目の自乗を計算している間、先に行ったの自乗の結果を保管しておく必要があります。上の式に同値なワードとして、次のようにしても良いでしょう: FORMULA1 { a b -- solution } a a * - a b b * a + . cr ; "矢印"(gazinta【たぶん、"goes into"の俗語だろうと思います。】)演算子、- は現在のスタック上の値(aの自乗の結果)を、名前付き引数 a に格納します。これは、この定義の実行開始の瞬間にスタックから取られた元々の a にある値に上書きされます。実行の終わり近くで、a は、b かける b の結果に加算されるために、再び呼び出されます。名前付き入力引数なしで同じ式を解くには、いくつかのスタック操作が必要であり、これには、エキスパートでさえも、ときどきしくじる事があります。 ついでながら、名前付き入力引数として格納された数値に対して実行できる演算操作は他にもあります。そこにある数値に数を加算したり、あるいはそこから数を減算したりすることができます。++ および-- 演算を使います。例えば、 10 ++ denom とすると、コロン定義内で、denomという名前の仮定的な名前付き入力引数に格納されている値に、10が足し算されます。 局所変数 ついでに、局所変数と呼ばれる重要な概念についても紹介しておきましょう。これもまた、一つのコロン定義の範囲内で中括弧の中に現れるものですが、前とは違って、そのような定義内で生じ得る中間的な結果に名前を割り当てるものです。局所変数はバックスラッシュの後に宣言します。例えば、次の式を使いましょう。: ( a + b - 3c ) ---------------- ( b + 2c ) ワード定義は、次のようにできるでしょう。: FORMULA2 { a b c \ num den -- result } a b + 3 c * - - num 2 c * b + - den num den / ; この例では、中括弧内のa, b,および cは、名前付き入力引数で、スタック上の値を取ります。バックスラッシュ(\)後で "--"より前の名前が局所変数で、 定義内で活用できます。この例では、分子と分母は別々に計算され、それぞれの局所変数に格納(- )されます。このとき、局所変数は結果を生み出す割り算のために適切な順序で再び呼び出されます。 注意:局所変数を利用する前に初期化する必要はありません。局所変数は定義のはじめにゼロで初期化されていると措定することができます。 チュートリアル目次へ 前へ レッスン9 次へ レッスン11
https://w.atwiki.jp/tuchinoko/
製造、交易情報追加。協力しろよ。 Copyright © 2008 NEXON Corporation and NEXON Japan Co., Ltd. All Rights Reserved. Copyright © 2008 NDOORS Corporation. All Rights Reserved.