約 1,831,819 件
https://w.atwiki.jp/mopsprogramming/pages/46.html
四則演算は、加減乗除すべて二項演算です。したがって、二つのスタックアイテムを費消し、結果をまたスタック上に押込みます。つまり、演算に供される値は、予めスタック上におかれている必要があるわけです。普通の計算式をMops/Forth風に変換すれば、 数学 Mops/Forth風 4 + 13 = 4 13 + 5 - 7 = 5 7 - 35 * 21 = 35 21 * 57 / 4 = 57 4 / となります。Mops/Forthのような書き順は逆ポーランド記法(RPN Reverse Polish Notation)またはPostfix記法と呼ばれます。Postfix(ポストフィックス)というのは、演算に供される数値(被演算項)に対して施される演算が、被演算項より後(Post)に決まるためです。演算後置法などと訳されることもあります。 なお、Mops/Forthコードでは、個々の数値間はもちろんのこと、演算記号も空白文字で画されている必要があります。 参考: Prefix + x y --- Lisp(Scheme)で採用 Infix x + y --- その他のプログラミング言語(一般数学) スタックアイテムは上から、つまり操作を加えなければ直前に格納されたものから順に利用されるため、括弧などを用いずとも曖昧さなく演算の順序がきまります。逆に、Mops/Forthでは括弧等を用いて演算の結合力を操作する機構はありません。コードに書かれた順に実行されていくため、演算子も先に登場したものから順に見ればよく、コードを書くときは計算を実施するべき順にブロックを固めて積み上げていけばよいといえます。 Mops/Forthでは、四則演算記号も、その実態は、特別な演算子ではなく、予め定義されたワードに他なりません。 関連項目: コード書記法の一般原則 データスタック ワードとは? 簡略化演算 剰余演算 トップページへ 目次へ
https://w.atwiki.jp/imops-forth/pages/38.html
小数用のワードセットは、対応する整数用ワードの名前の前にFを付けただけのものが多い。 オプションであるので、商品forthかgForthでなければ、規格に含まれた全てのワードが完備されていることは期待できない。Mopsもかなりズレがある。基本的に必要と思われるものについてのみ説明する。 なお、PowerMopsとiMopsでは、浮動小数点数は標準でダブル精度(64ビット)である。 FVARIABLE FVALUE FCONSTANT 浮動小数点数(以下、小数と略す)は、1セル幅が整数と異なる場合もある。そのために、小数用の変数を定義する方法がある。もっとも基本的なものは、FVARIABLEである。このワードと伴に変数名を宣言する。VARIABLEと基本的に同じである。 FVARIABLE ( “ spaces name” -- ) \ 小数変数を定義する 例えば、 FVARIABLE FV1 とすれば、小数変数FV1が定義される。FV1の動作は、そのデータ域のメモリーアドレスをスタックに置くのみである。この点もVARIABLEと同じである。 FV1 ( -- addr ) 実は、小数用変数といっても、実際には小数セル幅のデータ域でしかなく、整数用変数と本質的な違いはない。小数を格納し、または取り出すためのワードが違いを生みだしているのである。 FVARIABLEの小数の値を出し入れするのはF@とF!である。もちろん、F@は取り出し、F!は格納である。 F@ ( S addr -- ) ( F -- r ) F! ( S addr -- ) ( F r -- ) 小数の値は小数スタックに置かれる。値は、小数スタックと遣り取りされるのである。 小数ワードライブラリーがロードされていれば、数字は、小数点を付けるだけで小数と解釈され、小数スタックに置かれる。 0.1 FV1 F! \ FVARIABLE FV1に0.1を格納 FV1 F@ \ F -- 0.1 取り出し VALUEの小数版がFVALUEである。その名前を値と同一視でき、"TO"か"- "で値を格納する。宣言時に初期値が必要なこともVALUEと同じである。 0.1 FVALUE FVL1 \ 初期値は0.1 3.14159265 - FVL1 \ πの値を格納 FVL1 \ 値は小数スタックにコピーされる CONSTANTの小数版はFCONSTANTである。これはFVALUEと同じ構文で宣言し、ほとんど同じように利用することができるが、TOや- で値を格納することができない。 3.14159265358979 FCONSTANT PI 計算 スタック操作 四則演算は、通常の記号の前にFを付ける。 F+ ( F r1 r2 -- r1+r2 ) F- ( F r1 r2 -- r1-r2 ) F* ( F r1 r2 -- r1*r2 ) F/ ( F r1 r2 -- r1/r2 ) 特に説明は不要だろう。 小数の符号を変えるFNEGATE、絶対値を取るFABSも計算上有用だろう。 FNEGATE ( F r -- -r ) FABS ( F r -- |r| ) また、2つの小数のより小さくない方の値を取るFMAX、より大きくない方の値を取るFMINもある。 FMAX ( F r1 r2 -- r ) \ rは、r1、r2のうち、より小さくない方。 FMIN ( F r1 r2 -- r ) \ rはr1、r2のうち、より大きくない方。 スタック操作ワードはあまり多くない。実際、小数スタックは、整数スタックと比べて負担が軽いため、操作する必要性があまり生じない。これらも、通常のものの冒頭にFが付いたものになっている。 FDROP ( F r -- ) FSWAP ( F r1 r2 -- r2 r1 ) FDUP ( F r -- r r ) FOVER ( F r1 r2 -- r1 r2 r1 ) FROT ( F r1 r2 r3 -- r2 r3 r1 ) なお、forth標準にはないが、iMopsには次のワードも定義してある。 FDOWN ( F r1 r2 r3 -- r3 r1 r2 ) -FROT \ FDOWNと同義 FTUCK ( F r1 r2 -- r2 r1 r2 ) F2SWAP ( F r1 r2 r3 r4 -- r3 r4 r1 r2 ) 比較判定 値の大小比較ワードも、頭にFを付ければよい。しかし、標準規格にある小数の比較演算子は少ない。 真偽のフラグは整数スタックに積まれることの注意しなければならない。しかし、比較を連続する場合にはむしろそのせいでコードは書きやすくなる。 forth標準規格にあるのは以下のものだけである。 F ( F r1 r2 -- ) ( S -- b ) \ r1がr2より小さいときにはtrue(=-1)、そうでなければfalse(=0) F0 ( F r -- ) ( S -- b ) \ rが0より小さいときはtrue、そうでなければfalse F0= ( F r -- ) ( S -- b ) \ rが0のときはtrue、そうでなければfalse Mopsでは以下のような拡張ワードが定義されている。ただし、iMopsでは0と比較するものは、forth規格のものも含めて、定義されていない。 F ( F r1 r2 -- ) ( S -- b ) \ r1がr2より大きいときにはtrue(=-1)、そうでなければfalse(=0) F = ( F r1 r2 -- ) ( S -- b ) \ r1がr2より小さいが互いに等しいときはtrue(=-1)、そうでなければfalse(=0) F = ( F r1 r2 -- ) ( S -- b ) \ r1がr2より大きいか互いに等しいときにはtrue(=-1)、そうでなければfalse(=0) F= ( F r1 r2 -- ) ( S -- b ) \ r1とr2が互いに等しいときにはtrue(=-1)、そうでなければfalse(=0) F ( F r1 r2 -- ) ( S -- b ) \ r1とr2が異なるときにはtrue(=-1)、そうでなければfalse(=0) F0 = ( F r -- ) ( S -- b ) \ rが0より小さいときはtrue、そうでなければfalse F0 ( F r -- ) ( S -- b ) \ rが0より小さいときはtrue、そうでなければfalse F0 = ( F r -- ) ( S -- b ) \ rが0のときはtrue、そうでなければfalse F0 ( F r -- ) ( S -- b ) \ rが0のときはtrue、そうでなければfalse 整数との変換 整数を小数に、あるいは逆に、小数を整数に、変換するためのワードもある。整数は浮動小数点数としての整数に変換されるだけであるが、小数を整数に変換するときには、小数点以下は切り捨てられる。Forth標準では、整数側はダブルセル整数であることが予定されている。浮動小数点数の方が、大きな桁数を表現できるからであろう。 D F ( S d -- ) ( F -- r ) \ ダブルセル整数を浮動小数点数に変換 F D ( S -- d ) ( F r -- ) \ 小数をダブルセル整数に変換。端数は切り捨て。 ただし、iMopsではこれらは定義されていない。代わりに、forth標準ではないが、通常の、つまりセル1つ分の整数と小数の間で変換するワードが定義されている。 S F ( S n -- ) ( F -- r ) \ 整数を浮動小数点数に変換 F S ( S -- n ) ( F r -- ) \ 小数を整数に変換。端数は切り捨て。 PowerMopsではダブル・シングル両方とも定義されている。 ライブラリ関数 浮動小数点数ワードセットには、数学上の関数が含まれている。初等解析関数にあたるものである。関数名の冒頭にFを付けた名前のものが多い。 Mopsでは、これらの関数については、概ね標準Cライブラリの関数を呼び出すことで対応している。 Forth標準規格で定められているものは次の通りである。 FCOS ( F r -- r ) \ 三角関数の余弦(コサイン)cos() FSIN ( F r -- r ) \ 三角関数の正弦(サイン)sin() FTAN ( F r -- r ) \ 三角関数の正接(タンジェント)tan() FACOS ( F r -- r ) \ 逆三角関数、arccos() FASIN ( F r -- r ) \ 逆三角関数、arcsin() FATAN ( F r -- r ) \ 逆三角関数、arctan() FATAN2 ( F r1 r2 -- r ) \ rは-πからπの範囲で、そのtangentの値がr1/r2になる角 FCOSH ( F r -- r ) \ 双曲関数、cosh() FSINH ( F r -- r ) \ 双曲関数、 sinh() FTANH ( F r -- r ) \ 双曲関数、tanh() FACOSH ( F r -- r ) \ 逆双曲関数、arccosh() FASINH ( F r -- r ) \ 逆双曲関数、arcsinh() FATANH ( F r -- r ) \ 逆双曲関数、arctanh() FLOG ( F r -- r ) \ 常用対数関数(底が10):rは10のr 乗 FALOG ( F r -- r ) \ FLOGの逆関数。r は10のr乗 FLN ( F r -- r ) \ 自然対数関数 ln() FLNP1 ( F r -- r ) \ r は(r+1)の自然対数 FEXP ( F r -- r ) \ 指数関数exp() FEXPM1 ( F r -- r ) \ r はeのr乗から1を引いた値 F** ( F r1 r2 -- r ) \ rはr1のr2乗 FSQRT ( F r -- r ) \ r はrの平方根(ルート) なお、iMopsではFALOGは定義されていない。F**を用いれば定義は容易であるが。 ダブル精度、シングル精度 浮動小数点数を記述する規格には、総体を32ビットで表現するシングル精度と、総体を64ビットで表現するダブル精度がある。(この他に、X86のFPU(X87ともいう)では80ビット精度の浮動小数点数が用いられているが、これは措く。) 通常の小数は、各forthシステム毎に規格が異なる可能性はあるものの、当のシステムの標準にしたがった処理を前提としたワードで処理される。 しかし、他方で、外部ライブラリとの整合性の問題などから、シングル精度かダブル精度かを特定して小数を処理する必要が出てくることもある。そのためのワードもforth規格では規定されている。 DF! DF@ ダブル精度であることを特定して、小数をメモリーに格納、あるいはメモリーから取り出すワードが、DF!、DF@である。 DF! ( S addr -- ) ( F r -- ) \ 小数スタック上の小数をダブル精度の小数として、addrの位置に格納 DF@ ( S addr -- ) ( F -- r ) \ addrの位置に格納されたダブル精度小数を、小数スタック上に取り出し 小数スタックがダブル精度と異なる場合には、やり取りの間に規格が変更される。メモリー領域は64ビット(8バイト)なければならず、適切にアラインされていなければならない(アドレスが8の倍数ということ)。 Mopsではデフォルトでダブル精度であるから、F!, F@と同義である。これらはiMopsでは定義されていない。 SF! SF@ これらは、シングル精度であることを特定して、小数をメモリ上に格納、あるいはメモリーから取り出す。 DF! ( S addr -- ) ( F r -- ) \ 小数スタック上の小数をシングル精度の小数として、addrの位置に格納 DF@ ( S addr -- ) ( F -- r ) \ addrの位置に格納されたシングル精度小数を、小数スタック上に取り出し これらの場合も、小数スタックがシングル精度ではない場合には、やり取りの際、相互に規格変換が行われる。シングル精度小数を格納するメモリーのアラインメントは32ビット(4バイト)である。 なお、シングル精度の小数をスタック経由で外部関数に渡す必要がある可能性を考えて、iMopsではスタック上で、ダブル精度とシングル精度の間の変換を行うワード、SF F、F SFを定義している。これらは、forth標準規格にはない。 F SF ( F r -- r ) \ rはダブル精度、r はシングル精度の対応する小数。近い値に切り詰める(四捨五入)。 SF F ( F r -- r ) \ rはシングル精度、r はダブル精度の対応する小数。 小数スタック上ではダブル精度が前提とされているので、シングル精度ではスタック表示がおかしくなるので注意を要する。 F. FS. FE. 浮動小数点数をコンソールに印字するワードが三種類ある。 どれも小数スタック上の値を1つ消費して、その値を表示するが、表記方法が異なる。 F. は、小数点を用いて10進桁表示する。いわゆる普通にいう小数の表記である。1.234とか、567.89のような形式である。 FS. は、いわゆる科学記法で印字する。1.23E4とか、2.3E-6のような表記法である。 FE.は、エンジニアリング記法と呼ばれる表記法で表示する。規格には、有効数字は1.0以上1000.0未満であって、10の冪は3の倍数であるもの、とされている。正直、意味がよくわからない。多分、3.1415924なら3.142e0、746545834なら746.5e6、56708なら56.7e3、という感じだろうか? iMopsでも定義しているが、NextStepのコア関数の規格のままなので、キッチリforth規格には合っていない。例えば、F. FE.では、整数部分の桁数が多いと3桁毎にコンマを打つし、FE.の小数点以下は、小数第4位を四捨五入して第3位までに切り詰めて表示する。 一種のユーティリティーで、Mopsではプログラムに使うことはないワードである。 次 局所変数(locals)
https://w.atwiki.jp/nicoliveanimesurvey/pages/27.html
通常放送 第1クール 話数 1 2 3 4 5 1 91.6 6.2 1.5 0.3 0.4 2 94.8 3.7 0.6 0.4 0.5 3 94.1 4.4 0.8 0.3 0.4 4 94.4 4.0 0.9 0.1 0.6 5 96.9 2.3 0.3 0.1 0.4 6 96.1 2.5 0.5 0.3 0.6 7 96.9 2.0 0.4 0.2 0.5 8 95.2 3.3 0.7 0.2 0.6 9 98.8 0.6 0.2 0.1 0.3 10 94.4 4.7 0.5 0.1 0.3 11 93.2 5.4 0.8 0.3 0.3 12 94.6 4.4 0.5 0.2 0.3 13 96.6 2.3 0.4 0.3 0.4 平均 95.20 3.52 0.62 0.22 0.43 第2クール 話数 1 2 3 4 5 14 90.7 6.0 1.4 0.6 1.3 15 94.5 4.3 0.5 0.3 0.4 16 95.3 3.4 0.6 0.5 0.2 17 98.0 0.9 0.2 0.3 0.6 18 95.0 2.5 0.6 0.3 1.6 19 98.9 0.7 0.1 0.1 0.2 20 97.0 2.0 0.4 0.1 0.5 21 97.9 1.4 0.2 0.1 0.4 22 97.4 1.8 0.2 0.2 0.4 23 96.4 2.7 0.4 0.1 0.4 24 97.9 1.5 0.1 0.1 0.4 25 98.0 1.2 0.2 0.3 0.3 26 93.1 4.4 0.8 0.9 0.8 平均 96.16 2.52 0.44 0.30 0.58 一挙放送 放送日 話数 1 2 3 4 5 備考 2015/09/20 1~13 97.6 1.7 0.2 0.2 0.3 2016/01/20 1~6 96.9 2.1 0.3 0.1 0.6 一挙放送+「蒼穹のファフナー RIGHT OF LEFT」 2016/01/21 7~16 97.6 1.4 0.3 0.2 0.5 2016/01/22 17~26 97.7 1.5 0.3 0.3 0.2 2016/12/27 全26 97.7 1.4 0.4 0.1 0.4 2017/12/10 全26 97.7 1.5 0.2 0.1 0.5 一挙放送+「蒼穹のファフナー HEAVEN AND EARTH」 2018/12/05 1~13 97.2 2.0 0.5 0.1 0.2 一挙放送+「蒼穹のファフナー HEAVEN AND EARTH」 2018/12/06 14~26 98.0 1.2 0.4 0.1 0.3 その他 放送日 話数 1 2 3 4 5 2023/01/17 1~6 98.2 1.3 0.2 0.2 0.1
https://w.atwiki.jp/apicallover/pages/31.html
2016年1月、韓国NAVER tvcastで放送されたwebドラマ「チョコバンク DVD」が7月よりDATVで日本初放送されることが決定した。また「DATV LOVES EXO スペシャル」と題し、今年年末にかけてEXO出演の番組が続々放送される。 第一弾となる「韓国ドラマ チョコバンク DVD」は、EXO カイの初主演作品で、彼の自然な演技が話題となったドラマだ。カイの相手役は、子役出身で演技経験が長く「シークレット・ミッション」や「太王四神記」に出演したパク・ウンビンが務める。 父が事業に失敗し、多額の借金を残し他界。母の言いつけで公務員を目指すも、早くも就職浪人5年目に突入。あげくの果て、母には金融銀行に就職したと嘘をつき、スーツ姿で毎日職を探すキム・ウネン(カイ) と、カフェを営むショコラティエのハ・チョコ(パク・ウンビン) のロマンチック・ラブコメディ!店の経営を通して二人が切磋琢磨しながら様々な出来事に立ち向かっていく姿に共感でき、またラブラインにも目が離せない。スーツ姿やエプロン姿など、どのシーンを切り取っても見とれてしまう容姿端麗なカイのイケメンぶりにも注目だ。【ストーリー】 お金に困らないようにと名付けられた名前は※キム・ウネン(カイ)。企業家の父のもとに生まれ、将来は韓国のビル・ゲイツ!…になるはずだった。ウネンが 18 歳の時、父が事業に失敗し多額の借金を残し他界。母の言いつけで公務員を目指すも、早くも就職浪人5年目に突入。挙句の果て、母には金融銀行に就職したと嘘をつき、スーツ姿で毎日職を探す日々を送っていた。そんな時、カフェの経営に悩むショコラティエ、ハ・チョコ(パク・ウンビン) と出会い、店の経営を手伝わされることに。次第に忘れかけていた事業家の夢を再び抱くようになる。そして、チョコとの間にまさかの恋の予感!?夢を追いかける青春男女のロマンティック・ラブコメディ! ※ウネン=銀行の意
https://w.atwiki.jp/mopsprogramming/pages/18.html
スタック 7と4と1を、間に空白を入れて一行で打ち込んでください。 7 4 1 ENTER ENTER キーを押した後、スタックディスプレイは次のように見えるはずです。: Stack depth 3 1 4 7 三つの数字の間の空白(あるいはデリミター)は、Mopsに、これらは三つの別個の数値であるということが意図されている、ということを伝えます。(空白を一つ、でなければならないわけではありません。二つ以上つながった空白やTABキーでもかまいません。) 上と異なって、もし714と打ち込んだのなら、一個の数値である741がスタック上に置かれたでしょう。 数(など)が、どのように入力され、スタック上に格納されるのかを理解することは重要です。 スタックがどのように働くのかをはっきりさせる一番の方法は、よく使われるアナロジーですが、カフェテリアでよく見かける、バネ式お盆給仕機を用いる方法です。 バネつき台の上に盆を一枚のせると、そのお盆は一番上からとるとき最初の盆になるのは明らかでしょう。 しかし、二番目の盆を最初の盆の上にのせたならば、二番目の盆の重みで最初の盆は押し下げられ、列の次の客が一番上から取るときの盆は、二番目の盆になります。 言い換えると、スタックの上に最後に置かれたものが、最初に取り出されるものになるのです。 (コンピュータ用語ではLIFOと呼ばれ、"Last In, First Out"【後入れ先出】を意味します。) この原理がMopsのスタックにも適用できることがわかるでしょう。というのは、初めに入力した数7はスタックの底にあり、一番最近入力した数1は一番上にあるからです。 どうすれば、スタックから数を取り除くことができるでしょうか? 一つの方法は、あなたが数を入力したときにしたことと反対のことをするMopsワードを使うことです—これはスタックから数を取り除き、スクリーンの下方部分のカーソルが点滅している場所に、その数を"タイプ" (ないしプリント)します。 このワードとは、単なる.(ピリオド。"ドット"と読みます)です。 これを打ち込んでみましょう: . ENTER 1 ここで起ったことは、ドット(スクリーンにタイプ)コマンドが1をスタックの頂上から抜き取り、それを"タイプ"したということでした。 スタックディスプレイは、二つの数(4と7)がまだスタックに残っていることを示しています。 別の言い方をすれば、あなたがスタック上の数についてドットオペレーションを実施するといつでも、その数はスタックから取り除かれ、"タイプ"されるということです。—つまり、それは現行の(current)ウィンドウに表示されます。 (上の例でのように)Mopsウィンドウが現行ウィンドウであれば、"タイプ"される数はどれもカーソルポジションに現れるでしょう。これはまさに、あなた自身がキーボードにそれをタイプしたときと同じようになります。 Mopsプロンプト【に該当する点滅カーソル】を、混乱を避けるために左端に寄せるには、単にRETURNを(ENTERではありません!)一回押すだけです。 (改行(キャリッジリターン)は、あなたがプログラマとしてMopsにそのプリントを命じない限り、自動的にプリントされることはありません。少し後に、そのやり方を見るでしょう。) 今度は、二つのピリオドを、間に空白を挟んでタイプし、ENTERを押してみましょう。 . . ENTER 4 7 Mopsは、残った二つの数を、スタックから取り除いた順序でプリントしました。 7はスタックの一番底にあったことを思い出してください。; そのため、それはスタックから取り出される最後の数となったのであり、Mopsプロンプト(点滅カーソル)が再び現れる前の最後のアイテムとしてスクリーン上に表示されたのです。 ごらんのように、複数のドットコマンドは、スタックの頂上から引き続いて数値を取り除き、スクリーン上の左から右にそれらをプリントします。また、最後のドットコマンドが実行されたときには、スタックには何も残っていないことにも、注意してください。 Mopsは、.S("ドットエス"と読みます)というワードも持っています。これは、スタック上にある全ての数値を、それらを取り除くことなく表示するものです。 これは、プログラムが走行している間に使うと便利でしょう。というのは、ウィンドウの上方にあるスタックディスプレイを見るためにプログラムを止めたくはないこともありうるからです。 また、スタックに、スタックディスプレイに入り切らない程たくさんのアイテムがあるかもしれません。 スタックには、Mopsウィンドウの上方部分の空間に表示できるよりも、ずっと多くのアイテムを保持することができるのです。しかし、その場合でも、.S を使えば、全てのスタックアイテムが、ウィンドウの下方部分にタイプされるのです。 それがどのように働くのかを見るため、前に使ったのと同じ三つの数値をスタック上に置いてください (間の空白をお忘れなく。): 7 4 1 ENTER そして、.S を打ち込めば、スクリーンはこのようになるでしょう: .s ENTER Stack depth 3 1 $ 1 4 $ 4 7 $ 7 ドル記号($)の左の数字は10進表現ですが、 右側の数字は16進表現です。 このリストのドル記号は16進であることを示すものなのです。 この場合には、たまたまスタック上の数値がどちらの基数でも同じなのです。 スタックディスプレイは三つの数値がまだスタック上にあることを示していることにも注意してください。 通常の . は一つの数値を、表示し、同時に取り除きますが、 .S は全ての数値を、どれひとつ取り除くことなく表示する、ということです。 数値をスタック上に置き、それらを.S オペレーションで確かめ、その後、一つずつ、 または続けてプリントしつつ取り除く、という手順で、スタック上の操作を実験してみてください。 手間を減らす追加的方法として、 ドットコマンドの後に、CRコマンドを使うことができます---これは、 改行("Carriage Return")の略号です。 ひとつ以上の . コマンドの後に、CRをコマンドとして打ち込めば(最後のピリオドとCRの間の空白をお忘れなく)、Mopsプロンプト【カーソル】は次の行の左端に戻ります。 例えば: 1 10 100 ENTER . . . cr ENTER 100 10 1 | もし、たまたま、スタック上の数値の個数よりも一つ多く . コマンドを実行してしまったなら、 Mopsは、(警告ビープ音とともに、)スタックが空っぽである【のにアイテムを取り除こうとした】というメッセージを送るでしょう。 害はないので、試してみましょう。 1 10 100 ENTER . . . . cr ENTER 100 10 1 171 Error # -4 stack underflow . . . . cr ^ Current object TW class MLTEFWIND 【ちなみに、最後に吐き出されている171はスタックの底を示すマーカーで、起動時に積み込まれます。hex ABです。】 スタックは、パラメタースタックとも呼ばれます(ときどき、データスタックということもあります。)。 その理由は、Mopsの多くの演算が、それが実施できるようになる前に、 一つまたは複数の値がスタック上に存在していることを必要するからです。 これらの値は、コンピュータ用語ではパラメター(引数)と呼ばれ、 演算に渡される、とか手渡されるなどと言われるのです。 実際、演算はスタックに対して自分が必要な数をもとめ、それを取り除きます。 スクリーン上にプリントされるべき値をスタックが保有しているとき、パラメターがどのように働くのかについて、 前の節で少し見ました。 パラメタースタックは、言い方を変えれば、多くの演算が依存する値を積み込む一種のコンテナです。 この観念は、Mopsがどのように基本算術を遂行するのかを論じた後には、より明瞭になるでしょう。 スタック算術 もしヒューレット-パッカードのRPN計算機をお使いの経験があれば、 まず二つの数値を打ち込んで、それから、足し算には"+"、あるいは、かけ算には"*"といった、実施したい演算の記号の描かれた キーを押す、という方法はもうご存知でしょう。 これをしているとき、実は、スタック型のコンピュータを利用しているのです。 HPのRPN計算機を使ったことのない方のために、数2 を数 7に加算するときの手順を書いておきましょう。 【下の手順表の原文は辻褄が合わない気がするので(多分ミスプリント)、勝手に直しておきました。絶対の自信があるわけではない(RPN計算機を使ったことはない)ので、そのうち、ちょっと聞いてみます。】 7 キーを押します。 7 がスタックのトップに置かれ、ディスプレイにプリントされます。 ENTER キーを押します。これは 7を、HP 計算機のスタックのあと1セルだけ深いところに押し込みます。 それは計算機の記憶装置の中にあり、その記憶装置は、値を、それが演算に必要になるまで、一時的に保管するところです。 それから2 キーを押します。これは2 をスタックのトップに置きます。 最後に + キーを押します。これはスタックから各値(最初に7、それから 2)を読み取り、 これらを足し合わせます。 答、9は、ディスプレイとスタック上の両方に現れ、必要なら、さらなる演算に供されます。 Mopsもこれに非常によく似た動き方をします。 一歩一歩、二つの数を足し合わせるやり方を述べるなら、それは、各数をスタックに一回一個ずつ置いていき、 それから + キーを押す、というようなものになるでしょう。それは次のようになります。: 7 2 + . cr 9 | (各行の終わりにENTER を押すことは、もう、言うまでもありませんよね。) ここで何が起ったのか追跡してみましょう。 数をタイプしてENTERを押す毎に、スタックカウンターがどのように増えていくのかについては、もうお分かりでしょう。 三行目で、演算、つまり足し算記号 "+" を打ち込んでいます。 ここでENTERを押すと、コンピュータはあなたのために、スタックにある上の二つの数の和を計算し、 その和をスタックに格納してくれます。(したがって、スタックディスプレイは、スタック上の一つの数を示します。) もともとあった数は、加法演算によってスタックから取り除かれることにも注意してください。 というよりむしろ、ほんの一瞬の間ですが、二つの数がコンピュータ内で加算処理されている間は、スタック上には何も無いのです。 【老婆心ですが:足し算のような単純な演算では、この説明は微妙ですが、もっと一般の複雑な演算処理(サブルーチン)の場合には、まさに上のように考えることができる場合が多くなります。】 スタックの内容(この場合は、足し算の結果)を表示するためには、 .("ドット")コマンドを発行しなければなりません。 もちろん、答9がスタックに置かれていたわけです。 Mopsでは、これらの操作全てを、もっと単純な一行命令の形式で行うことができます。各要素の間に少なくとも一つの空白が必要なだけです。 それは次のようになるでしょう。: 7 2 + . cr 9 | この一行命令は、前のものと同じコマンドを一つ一つ順に含んだものになっていますが、ずっと打ち込みやすいものになっています。 この方法でやると不便といえるは、スタックディスプレイを一歩一歩読み取ることができなくなる、といったことぐらいでしょう。 しかし、結局は、重要なのは答えであり、一時的なスタックの途中経過ではないはずです。 チュートリアル目次へ 前へ レッスン1 次へ レッスン3
https://w.atwiki.jp/tcgexplorer/pages/65.html
解凍すると TcgExplorer.exe zlib1.dll \pluginフォルダ の3つが作成されます。あとはプラグインフォルダにTCGデータをぶち込んで起動すれば動くはず。 メニューにマニュアルっっぽいのがある。 ダウンロード(このページ内にアップ) http //www38.atwiki.jp/tcgexplorer?cmd=upload&act=open&pageid=65&file=TcgExplorer20111212.zip 変更箇所 修正箇所 デッキタブ切り替え時にデッキリストの描画が被ってエラーが出るのを修正できてたらいいなぁ 複数タブがあるプラグインで空領域のあるデータを呼び出した場合、エラーが出るのを「一時的に消去」←いわゆる未解決 既知の問題
https://w.atwiki.jp/mopsprogramming/pages/38.html
アプリケーションのインストール 【以下【】の中は訳者が付け足したものです。】 このレッスンでは、わたしたちのCurvesプログラムを、ダブルクリックで起動できるアプリケーションとしてインストールしましょう。 まず始めに、レッスン19で説明したGrDemoをロードしてください。ただし、今回は、プログラムを実行しないでください。 Mac OS X 10.4ユーザーへの注意::QuickDrawに関するトラブルを避けるため、Tigerユーザーは、Mach-O PowerMopsを使っている場合には、grDemoのソースコードを少し変更する必要があるでしょう。ファイル grdemo の中に、GRWINDクラスのNEW メソッドの定義があります(170行目)。このメソッドの定義の中の、 RR tAddr tLen docWind という行と、 true false という行の間に、次の一行を挿入してください。 $ 40000000 OR \ use QD on Tiger つまり、このメソッドの終わりの部分は次のようになります: RR tAddr tLen docWind \ initial rect, title, window type $ 40000000 OR \ use QD on Tiger true false \ visible, no close box dView \ the main view new super \ create the window! それから保存して、ファイルを(リ)ロードしてください。 installと打ち込んで実行するか、Utilitiesメニューから install... を選択してください。どちらかの方法で、【68k Mopsの場合は】次のダイアローグボックスが現れるでしょう。: 試しに、コントロールをクリックしてみてください。(ボタンはまだクリックしないでください) Dictionaryの数値が増えると、同じ量だけHeap数値が減少することに気付くでしょう。スタックについても同様です。ここで定義しているのは、あなたのアプリケーションで利用可能なメモリーをどのように使うか、です。‘stack’スペースは、パラメータースタックとリターンスタックに当てられます。システムは様々なシステムコールが行われたときにはパラメタースタックを使うことになりますから、この数字を20000より小さくしないようにお勧めします。 Dictionaryの数字は辞書のために割り当てられるメモリーの量を示していますが、これは現在既に割当てられているものに追加される分です。ここで行っているのは、既にロードされたアプリケーションのインストールなのですから、ここにあまり大きな数値は必要ありません。というのは、私達のアプリケーションが走行しているときには、もうこれ以上定義が辞書にコンパイルされることはないだろうからです。 Heapの数字は、プログラムが走行しているときにシステムに要求して利用可能になるメモリーの量を示しています。ここの数値は、利用可能なこの種のメモリーの最大量です。基本的には、スタックと辞書スペースが割り当てられた後に残ったものは全てヒープのために利用できます。ここに現れる数字は単なる参考でしかありません。というのは、インストールされたあなたのアプリケーションが走行しているときに利用可能なメモリーの量は、インストールを実施しているときの量と同じではないかもしれないからです。 ですから、スタックと辞書のために本当に必要なものだけを利用して、アプリケーションの走行中に利用可能なメモリーを最大にしておくのがよいでしょう。 通常は、アプリケーションをインストールするときには、それらは放っておかれることになるでしょう。 そうすれば、デフォルトでヒープへの割当が最大になります。 もしもボタンをクリックして値を変更してしまった場合は、"Max Heap"ボタンを押すことによって、デフォルトの設定に戻ることができます。 デフォルトのスタックへの配分が20000であることがわかるでしょう。これは私達の推奨する最低値です。辞書についてはたった128です。これは、あなたのアプリケーションが文字列をHEREに移動するコードを実行するような場合に備えた安全マージンを取ってあるに過ぎません。あなたのアプリケーションがHEREにもっと多くの領域を必要とすることがわかっているなら、この数値を調整することができます。このデモプログラムについては、しかし、その必要はありません。 さて、メモリー要求項目をチェックしたら、installをクリックしてください。次のようなダイアローグが現れるでしょう。実は、PowerMopsでは、これが最初のダイアローグとなります。また、PowerMops版は、特別なチェックボックス‘Generate shared library’も持っています。これについては、後でお話ししましょう。 このダイアローグでは、あなたのアプリケーションのクリエーターコードとファイルタイプを設定できます。これらは共に、4文字コードです。詳しくはInside Macintoshに説明されています。 あなたのアプリケーションを広く配布したいときには、これらのコードをAppleに登録して異なるプログラムが同じコード番号を用いないようにする必要があるでしょう。しかし、個人的に利用する場合には、何でも好きな4文字を利用することができます。このデモプログラム、Curvesについては、"CRVS"を選びました。 Curvesはそれが領有するドキュメントは持ちませんから、その他の欄は空白にします。アプリケーション名"Curves"を適切な欄に打ち込み、バージョン文字列に当たるものを書きます。この例では、‘version 1’を入れました。意味はわかるでしょう。 ダイアローグボックスは次のように見えるでしょう。: 前のレッスンで、‘スタートワード’と‘エラーワード’を説明しました。このダイアローグは、それぞれに、GOとCRASHを示唆しています。これは実際に私達が使ったワードの名前ですから、これはこのままにしておきます。 インストールされたアプリケーションでのこれらのワードが扱われ方はvectorsのメカニズムのおかげで、非常に単純です。これについてはレッスン20で触れました。 vectorは、いくつかのForthシステムでDEFERred wordと呼ばれているものと、基本的には同じものです。vectorはアドレスを保管しています。普通のワードと同じやり方でvectorを呼び出したときには、しかし、実行されるのは、そのアドレスが指しているワードです。このアドレスはいつでも変えることができます。スタートワードとエラーワードは二つのベクトルQuitVecとAbortVecに格納されます。 (やや紛らわしい名前ですが)QuitVecは、ワードQUITが実行されたときにはいつも実行されます。これは、実際には、Mopsのインタープリテーションループ(キーボード入力を待ち、それを実行するループです)の各回の初めにあります。通常は、QuitVecは何もしません(NULLを指しています)が、インストールされたアプリケーションでは、スタートワードを指すように設定されています。このスタートワードは、不定回ループで、クリックなど何であれ入力を処理し続けるべきものであって、それ自身が終了してしまってはいけません。もちろん、アプリケーションは最終的には終了しますが、それはスタートワードから呼び出される何らかのワードで処理されるユーザーアクションに応えてのものでなければなりません。これは、スタートワードは、その最後のセミコロンを抜けてはいけないということを意味します。もしそうなると、QUITの残りの部分が実行されて、キーボード入力をMopsワードとして解釈しようとします。これは、明らかに、インストールされたアプリケーションで起って欲しいことではありません。— Mopsウィンドウはおそらくもうそこにはないでしょうから。 AbortVecは、通常、Mopsのエラーメッセージが現れるエラーをMopsが感知したときに呼び出されます。QuitVecと同じように、それもはじめはNULLを指しています。インストールされたアプリケーションでは、ユーザーにスタックダンプを見せたくはないでしょう(そして、ともかく、MopsウィンドウやfWindはそこにはないでしょう)から、あなたのエラーワードは、何であれあなたのアプリケーションにふさわしいことをなすべきであり、おそらく、BYEを実行して終了し、Finderに戻ることになるでしょう。スタートワードと同様、これも終わりのセミコロンを抜けてはいけません。というのは、そうなるとMopsはMopsスタイルのエラーメッセージとスタックダンプを表示しようとするからです。 さて、ダイアローグボックスについて続けましょう。 ‘Include fWind’と‘fWind visible’はチェックのないままにしておきます【PowerMopsにはこれらのチェックボックスはありません】。これらは、"拙速(quick and dirty)"アプリケーションに利用できるキーボード入力およびテキスト出力用の簡単なウィンドウに関係しています。これは、実は、Mopsの基礎的な核部分がMopsシステムの残りの部分をロードする前に使用しているものです。Curvesは、自分自身のウィンドウを持っていますから、このウィンドウを使うことはありません。ですから、これらのボックスはチェックのないままにしておいて、InstallにおいてfWind用のリソースを無視してもよいことを教示するわけです。同様に、インストールされたアプリケーションにはコード生成機能は必要ないといえるでしょう。 もうダイアローグの必要な部分は全て埋めましたので、OKをクリックしましょう。このとき、標準的なファイルナビゲーションダイアローグが現れます。アプリケーションをインストールする場所のフォルダーを選択して、Saveをクリックします。PowerMopsは直ちに終了するでしょう。それから、あなたが選択したフォルダーをのぞいてみれば、新しいアイコン(68k MopsとPEF/CFM PowerMopsの場合)またはフォルダー(Mach-O PowerMopsの場合)で、‘Curves’という名前のものをみつけることができるでしょう。これがあなたのインストールしたアプリケーションです。 しかし、このアプリケーションはまだ起動できません。メニューリソースが含まれていないからです。 68k MopsとCFM PowerMopsの場合: その追加はリソースエディターで行うことができます。ResEdit、あるいは何らかのリソースフォークエディターでいいですが、それを起動し、demo.rsrcファイルを開きます。demo.rsrcファイルをダブルクリックするだけでも大丈夫でしょう。そして、‘全選択(Select All)’をした上で‘コピー(Copy)’します。それから、(まだResEdit上での作業です)Curvesのアプリケーションファイルを開き、‘貼付け(Paste)’します。それからアップデートされたCurvesを保存し、ResEditを終了します。 Mach-O PowerMopsの場合: ファインダー上でdemo.rsrcのコピーを作り、それを(名前はdemo.rsrcにして)、新たに作られたフォルダー構造の中の‘MacOS’フォルダーに入れます。それから、‘Curves’というフォルダー名の後に、‘.app’拡張子を追加します。 あなたの新しいアプリケーションは、適切なアイコンを持っておらず、原始的なアプリケーションアイコンしかついていないでしょう。しかし、それ以外は完成しました。ダブルクリックして起動することができます。 アイコンに関しては、Part IIの第五章でお話しします。 これから進むべき道 あなたはもう随分と Mops とオブジェクト指向プログラミングを経験しました。Mops が Macintosh ツールボックスとどのような形で連絡して、あなたのプログラムとMacとの間の通信の方法を単純化しているのか、についても見てきました。いまや、あなた自身のプログラムで実験を始めるべきときです。Part II のいくつかの章は、Macintosh上でMopsプログラミングを行う際のもっと細かな点について詳細に説明しているので、あなたの進むべき道を示してくれるはずです。 Mops辞書にある既定義クラスとワードのパワーを知ることは重要です。読んで済ますことからは得られないものもあるとはいえ、このマニュアルのPart IIIで詳説された既定義クラスのメソッドを一定時間かけて研究して、あなたに利用可能な構築素材を見つけるようにするのもよいでしょう。 Part IVのMops索引や用語集をながめるのもよいでしょう。そこには、メソッドのために指定できる演算についてのアイディアを与えてくれる、たくさんの組み込みワードを見つけることができるでしょう。 このマニュアルや様々なMopsファイルの中には、利用可能なたくさんの参考資料が含まれています。それら利用しつくす最良の方法は、独自のクラスの定義に取りかかり、あなたがつくったオブジェクトにメッセージを送る実験をすることです。 ちょうど話し言葉と同じように、Mopsについても、その実地経験を多く積めば積む程、より短時間で難なく使いこなせるようになることでしょう。 チュートリアル目次へ 前へ レッスン21 最終
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/mopsprogramming/pages/42.html
データスタックはForth言語系に特徴的な数値の格納庫です。プログラム中、いつでも使うことができます。一般的なプログラミング言語の局所変数にあたる役割をはたします。格納できる数値(アイテム)の個数に特別な制限はありません(利用できるメモリーの範囲)。 データスタックを使うには数値(リテラル)やオブジェクト名をプログラム中に書くだけで十分です。それらは、書かれた順にデータスタックに格納されていきます。 4 5 2 123 37 \ 実行時にデータスタックには5つの数値が格納されます。 必要なデータが格納されたなら、それらを引数として使用する関数(Forth系では"ワード"と呼びます)を呼び出せば、スタック上のデータは、後から格納したものから順に消費されます。このような取り出し順序は、「最後に格納されたものが最初に取り出される」という意味で、LIFO(Last In First Out)型と呼ばれます。 Mopsプログラミングでも、他のForth系開発環境と同様、データスタックの存在を意識することは重要となります。 データスタックは、パラメタースタックとも呼ばれます。また、単に"スタック"といえば、普通、データスタックを指します。 データスタックには、整数スタックと浮動小数点数スタックがあります。PowerMopsではこれらを別々のスタックとして実装しています。68k Mopsは特別に浮動小数点数スタックは持たないようです。68k および32ビットPowerPCでは、整数データスタックは常に32ビット幅です。PowerMopsの浮動小数点数スタックは64ビット幅です。 68k Mops環境では浮動小数点数を利用するには浮動小数点数ライブラリファイルをロードする必要があります。PowerMopsでは浮動小数点数スタックは常駐していますが、Mopsウィンドウに表示させ、浮動小数点数用ユーティリティーワードを完全に利用できるためには、やはり、浮動小数点数ライブラリファイルのロードが必要です。 関連項目: スタックの実装と利用原則 スタック操作子 ワード(関数)を定義する トップページへ 目次へ
https://w.atwiki.jp/2chmgspw/pages/126.html
「EX052 キッドナッパー殲滅」をクリアしてなくても「EX088 対戦闘ヘリ戦 AH56A-bomber 」出現しました。 - 名無しさん 2010-07-04 23 46 56 「EX029 アイテム奪取」をクリアしなくても「衛兵排除」をクリアしたら「EX080 対戦車戦 KPz 70 」出現しました。 - 名無しさん 2010-07-05 00 17 1868 - 名無しさん 2010-09-09 00 14 31 上2つとも修正しました - 名無しさん 2010-07-11 18 47 14 チコの「怪物の島の伝説」の「怪物の島」を聞いてないのに、スネークでEX029アイテム奪取の海岸にある桟橋へ行ったらトレニャーがいました。「地理情報」にあるネッシーなどのUMAの話は全て聞いていました。 - 名無しさん 2010-07-12 07 49 14 ↑ マジっすか!? - ニャー 2010-07-13 21 01 54 EX020はEX044か041のどちらかクリアっぽいです。 - ALEX 2010-07-17 09 46 56 ↑EX044クリアでEX020出ました - 名無しさん 2010-07-19 15 13 27 ex35で取れにゃー確認っす - 名無しさん 2010-07-27 09 07 42 ピューパ改クリアで上の出現条件未確認の大型兵器ミッションでてきました - 名無しさん 2010-08-01 23 39 37 未確認のやつ全部でてますけど、教えましょうか - インデックス 2010-08-13 10 49 42 ex96は85か109、85は98か37、104は37(たぶん・・・)20は44か41です。 - 名無しさん 2010-08-13 10 55 40 EX008のターゲット射撃はEX015フルトン回収をクリアしなくても出現してました(ザドルノフ捜索クリア後 - 名無しさん 2010-08-14 08 41 57 ザドルノフ捜索4終了後、EX84は手付けずですが他のミッションをやっていたらいつの間にかEX40が既に出現していました。他にもEX40の出現条件があるかもしれません。 - 名無しさん 2010-09-29 10 17 58 追記:ザドルノフ捜索4終了後、EX63→EX57→EX59の順にクリアしている状態です。(左記の順でEX59終了後にザドルノフ捜索5が出ました) - 名無しさん 2010-09-29 10 22 38 ザドルノフ捜索系ミッションはなにかしらのミッション(ターゲット射撃以外)をやってると自然にでます。初めまして罪歌(サイカ)です。よろしくお願いします。 - 罪歌 2010-11-13 22 24 46 完全ステルスは、どうやってだすんですか - ドラ 2010-11-16 16 23 41 ex64のプーヤンミッションをクリアーした後 - 名無しさん 2011-03-14 21 25 36 現在出現条件未確認のミッション EX104 対装甲車戦 LAV-typeG Custom EX085 対戦闘ヘリ戦 Mi-24A Custom EX096 対戦車戦 KPz 70 Custom はパスの乗ったZEKEを倒したら出ます - ケンケン 2012-01-24 15 24 33 KPz70はちょうど3章クリアしたときには既にありましたよ - 名無しさん 2015-07-16 08 32 18 ら~ん~ら~ん~る~!? - ドナルド 2012-08-27 14 44 06 は!? - X 2012-08-27 14 45 21 簡単で最強の武器を教えてください - 伊達星陽 2012-10-08 14 29 35 デコイでしょうかね? - A K A R A 2012-10-16 19 57 54 なにいってんだCQCだろ - 戦いの基本は 2012-10-25 23 08 51 やっぱしプロレスマニアのCQCでしょww - 瓜 2012-12-08 18 53 24 何を言ってるんだ君たち - 名無しさん 2013-01-24 19 48 06 スタンロッドがあるじゃないか - ↑の続きです 2013-01-24 19 49 35 wwwwww - AK47 2013-08-04 00 26 43 対メタルギアZEKE戦出現条件 が間違ってます。「支援レベルが2以上」ではなく「ミッション支援施設ランクが2以上」が正しいです。 支援レベルなんて言葉はたぶんありません。 - 名無しさん 2016-03-03 03 23 36 ついでに言っておくと ミッション支援施設ランク2=諜報班レベル40で達成であり ミッション支援施設ランク1の建造のためには司令塔ランクを6まで上げる必要で、司令塔ランク6=研究開発班レベル40以上です。 しかも班レベルが達成した上でマザーベース建造のための期間(ミッションをこなす)が必要です。 - 名無しさん 2016-03-03 03 28 05 要するに 研究開発班レベル40以上 かつ 諜報班レベル40以上 で マザーベースのプラント建造が終了するまでミッションをこなすこと が正確な条件になります。 新しくニューゲームしたりしてマザーベースが発展していないようなうっかりさん(俺)にとっては結構大事なことなので書いておいて欲しいです。 - 名無しさん 2016-03-03 03 32 21 ZEKEミッション解放について、マザーベースの改修の法則を検証しましたー。まずルールですが、対応する班のレベルが一定に達してると自動で進行します。進行スピードはアイテム開発と同じくターン制です。ただしアイテム開発と違って班レベルが大きく超過しても進行スピードは上がりません。 - 名無しさん 2016-03-24 04 31 33 何度かやり直した感じだと、4章クリア時点で司令塔ランクは3 - 名無しさん 2016-03-24 04 33 34 失礼、誤って送信しました。 4章クリア時点での司令塔ランクは3が上限となっているもよう。ここから上げる施設ランクを検証しました。 - 名無しさん 2016-03-24 04 35 09 司令塔ランク3→4は研究開発班レベル30以上が条件で、1ターンあたり10%ずつ進行。司令塔ランク4→5は研究レベル35以上で10%/ターン。司令塔ランク5→6は研究レベル40以上で7%/ターン。司令塔ランク6になるとようやく支援施設を建造できるようになります。 - 名無しさん 2016-03-24 04 39 18 次にミッション支援施設ランク0→1は諜報班レベル30以上が条件で11%/ターン。支援施設ランク1→2は諜報レベル40以上で8%/ターンです。 - 名無しさん 2016-03-24 04 41 52 なお通算の必要ターン数を数えてみると司令塔ランク6完成までに35ターン、支援施設ランク2完成までに23ターンで合計58ターンかかります。6分以上かけない限りはミッション数=ターン数なので結構な作業ですね。ちなみにZEKEミッションを出すには全ての条件を達成した状態でさらに2ターンが必要みたいです。 - 名無しさん 2016-03-24 04 47 25 モンハンミッション出現条件が全然必要条件になってないですね。チコのブリーフィングのうち聴かなければならないのは『地理情報』のうちの【!2】の情報とその派生情報、それと『怪物の島の伝説』の怪物の島の情報です。ちなみに音声を聞く必要はなく、×連打でメッセージを送っていいです。 - 名無しさん 2016-03-15 22 57 28 故に最速でモンハンミッションを出すには少なくともコクーン戦をクリアすることも前提になっています。ちなみに条件のブリーフィング情報は全てUMA絡みです。 - 名無しさん 2016-03-15 22 59 46 具体的には『地理情報』の「谷川」-「本物のバジリスコ」、「火口付近」-「ネッシー」-「ナウエリート」-「オゴボゴ」-「モケーレ・ムベンベ」、「熱帯雲霧林」-「ビッグフット」-「モノス」、「遺跡」-「コンガマトー」、「採掘場偽装基地」-「UFO」-「アブダクション」-「エルバッキー」、そして『怪物の島の伝説』-「怪物の島」です。これとスネークでの出撃が正しい条件ですね。 - 名無しさん 2016-03-15 23 05 19 ↑今日ニューゲームで調べてみたら、なんと『怪物の島の伝説』-「怪物の島」は聞く必要がないことがわかりました!つまりほんとにUMAのタイトルの情報だけでいいんです。wikiの記述おおざっぱすぎ! - 名無しさん 2016-03-17 00 50 25