: Mops ( オブジェクト指向FORTH -- ) ;
ニッチ(Mac)の中のニッチ(FORTH)。
オブジェクト指向FORTH言語、Mopsについて語るスレ。
いや、語れるのか‥‥?
3 :
デフォルトの名無しさん:01/09/10 20:32
そういや Mops 落としたことあるけど、全く使ってないな。
つか、中身も全然みてない。
FORTH がどうやったらオブジェクト指向になるんだろう。
確かに 1 2 + . がメッセージパッシングとして見えなくは
ないけど。クラスの定義とか継承とかできるんだっけ。
よかったら解説きぼん。
>3
オブジェクトにメッセージを投げるのは、
someMessage: anObject
のよーにする。最後に『:』のつくワードはメッセージと解釈される。
パラメタが必要な時には someMessage: の前にスタックに積んでおくぞ。FORTHだからね。
最後に『:』のつくワードはコンパイル時に、直後に置かれたオブジェクトを調べて
メソッドの結合を済ませてしまう。静的束縛なわけだ。
動的束縛にしたい時は、
someMessage: [ anObject ]
という具合にオブジェクトをカギカッコでくくっておく。するとメソッドの結合は、
実行時まで遅延される。C++と違って呼び出し側が選ぶわけね。
(メソッドディスパッチのためのテーブルを常に辞書に抱えてるのね〜。メモリ食いかも〜。)
4の続き。
FORTHであるが故に、メッセージ: オブジェクト の順序になるのだが、結果として、
print: GIKO
のごとく英語の語順としては自然になるため思ったより読みやすい。
(逆に「日本語でワードを登録したらMINDみたい!」、ってわけには逝かなくて残念無念。)
クラス定義は
:class someClass super{ superClass1 superClass2 }
var someVariable
:m someMethod { n1 n2 -- }
n1 n2 +
put: someVariable
;m
;class
みたいな感じっス。
スーパークラスは複数許されるので多重継承可能っす。
someClass MONA
1 2 someMethod: MONA
とするとMONAオブジェクトのsomeVariableに3が入るぞな。
7 :
デフォルトの名無しさん:01/09/10 22:08
>>5 逆だったらよかったのかもね。
GIKO print:
っていう語順、つまりStackTopにselfが置かれて、messageなOperatorはまずStackからselfをpopするっていう形ならば。
でもそれだと、メソッドの静的結合は、困難になるかな。
まあ動的オンリーでいいじゃんという気もするが。
>7
ややっ。もしかしたら静的束縛も可能かも。
メッセージ側に静的束縛を示す修飾子みたいなのを用意して、
オブジェクトのコンパイル時に直後のメッセージが修飾子付きなら
メソッド結合を済ませたコードを生成すればいいのかも。
修飾子なしならオブジェクトのselfをスタックトップに積む。
いかが?
解説どうもありがと。
>>8 私も
>>7 と同じで、レシーバを後に書くのは逆に FORTH的じゃないような
気がしたんだけど、message を先にスタックに積んでおいて後でオブジェクトを
作用させることで挙動がポリモーフィックになるとすれば、納得できるような
気もする。
ところでメッセージを実行した後のスタックの状態はどうなるの?
そのメッセージを受けたオブジェクトがスタックに残るわけかな。
スタックトップにあるオブジェクトにメッセージを送ることはできるの?
>9
メッセージを実行した後には、呼び出されたメソッドが残したスタックの状態以外なにも
残らないです。分かりやすいのですが、メッセージを連続的にオブジェクトに流し込むSmalltalk的な
使い方ができない原因でもあります。
スタックトップにあるオブジェクトにメッセージを送る場合は、
anObject someMessage: []
という構文が使えます。スタックトップのオブジェクトの解釈は実行時までわからないハズなので、
動的束縛による呼び出しになりますが、そのオブジェクトの属するクラスをコンパイル時に指定
してイイ場合には、
anObject someMessage: class_as> someClass
という呼び出し方をすることで、実行時のオーバーヘッドを小さくする事が出来ます。
forthでOOPしたいんか?
>11
したいっていうか、もうやっちゃってる人がいる。(w
>>10 あそうか。メソッドの結果をスタックに残す場合、デフォルトで
レシーバもスタックに残っちゃうとかえって扱いにくいだろうな。
> anObject someMessage: []
なるほど。てことは、メソッドの中で復帰値として自分自身を明示的に
スタックに積んで終了すれば、同じオブジェクトに連続的にメソッドを
作用させることもできるわけだよね。
> anObject someMessage: class_as> someClass
> という呼び出し方をすることで、実行時のオーバーヘッドを小さくする事が出来ます。
メソッド呼び出しの束縛の仕方を動的にするか静的にするかを C++ の
ように定義側ではなく、呼び出す所で選択できるのはなかなかよい
ですねぇ。結構イケてる言語なのかも。
>13
> なるほど。てことは、メソッドの中で復帰値として自分自身を明示的に
> スタックに積んで終了すれば、同じオブジェクトに連続的にメソッドを
> 作用させることもできるわけだよね。
なるほど、そういうやり方もありますね。
> 定義側ではなく、呼び出す所で選択できるのはなかなかよい
> ですねぇ。結構イケてる言語なのかも。
面白い言語だと僕は思うんですけど、あまりにマイナーなもので‥‥。
呼び出し側が束縛の仕方を選べる言語って他にあるのかな?
私は詳しくないんですが。
MOPSって、CLOSのMOP(meta object protocol)の
ことじゃないですよね・・?
Mops も CLOS も詳しくないのでアレだけど
>>16 Mops は
Michael's Object-oriented Programming System
とのことなので MOP とは関係ないみたい。
とは言え、Mops のベース言語である FORTH 自体が自己拡張性を
持った言語なので Mops でもその辺の機能がある程度使える、
…かもしれません。
>>15 > C++ みたく実行効率重視の言語だけが両方持ってるんじゃないかな。
一般的なオブジェクト指向言語から見るとC++のほうが特殊というわけですね。
> このページにある FAQ に「Win32Forth が Mops のオブジェクトモデルを
> 取り入れている」とあって、下から落とせるみたいね。
そんなものがあったんですね。気がつきませんでした。
我々は孤独ではなかった!(藁
アセンブラでかかれているMopsのコア以外の部分はFORTH自身で記述されてい
るので、やろうと思えば別のFORTH処理系にも持っていけるのかも。
>>17 > Michael's Object-oriented Programming System
Michael Horeっていうオーストラリアのおぢいさん(孫がいるらしい)が一人で
開発しているらしいデス‥‥。
forthって中間言語以外の用途ってあるんでしょうか
Forthを中間言語に使っているシステムってどれ?
保守カキコ。深度285/376。sageヨシ。
>>19-20 中間言語ってのとは少し違うがSunのOpenBootとかAppleのOpenFirmware
とかはFORTHみたい。
JavaのVMはスタックマシンみたいだけどスタックマシンならFORTHか?と
言われると少し違うような気がする。
っていうかたいていのコンパイラはスタックマシン向けのコードを生成して
からレジスタ割付けなんかをやって最適化したネイティブコードを作ってる
のでないかな?でもそれをFORTHとはよばないやうな。
あんまり知らんけど。
保守カキコ。深度189/378。sageヨシ。
ぢつは、日本語化をあれから少しだけやってみた。
クラス定義だけできるようになった。
↓
「 モナークラス 」は「 オブジェクト 」を継承し、
『 セリフ: " オマエモナ〜" 』
を実装する。
メソッドを呼び出す構文で良いのが思い付かず、途中やめにしてる。
へたれです………。
∧ ∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
〜' ― (,,゚Д゚) < 深度248/402。sage!!
し― し-J \___________
24 :
デフォルトの名無しさん:01/10/23 00:34
爆雷投下
たどり着いたらいつも雨降り
26 :
第4番目の名無しさん:01/10/23 18:06
OpenFirmwareから書き込んでいますうそ
FORTHの考え方は好きだなぁ。
フェチ逝って良しですか?
27 :
デフォルトの名無しさん:01/10/23 18:18
スタックトップのオブジェクトをレシーバーとする方がきれいだと
思うがなあ。anObject message とか。
数値も文字列もオブジェクト。+や.もメッセージと考えればすべて
うまくいくような。あ、引数なしのメッセージが困るか?
>27
そういうのも蟻だと思う。
ANS仕様のForthならインタプリタやコンパイラいじり放題だから俺流アプローチのOOPが可能だよね。
俺は挫折したけど。
>>27 たしかに、
anObject message
の形だと日本語の文脈にも合うので美しいなぁ。
‥‥‥‥コンパイラの中枢部分まで降りていって書き換えるか。
>>28 Forthはいじり放題、てのには激しく同意。
制御構造だろうがなんだろうが俺流につくれてしまう
Forthマンセー。
なんだけどおかげで方言だらけ(涙)。
Mopsも完全にはANSI互換じゃないしなぁ‥‥。
>>26 名前がとても良いです。
このスレのデフォルトにしたいぐらいに。
メタコンパイルage
Mopsではmessageには
print:
のように最後に:を付けて区別しているので、
日本語化する時には、
印刷する。
みたいに最後に。が付いたモノは オブジェクトに
対するメッセージと言う事にすればヨイかな、
と思ったのですが、引数はどこに置くのがいいんでしょうね。
1)
anObject p1 p2 p3 message
2)
p1 p2 p3 anObject message
1)は引数とanObjectを区別するために少し細工が必要か。
(ブロック構文みたいになるかな?)
2)はmessageを直前にスタックに積まれたオブジェクト
に投げればイイだけなので実装は楽かと。
でも日本語化した時に楽しいのは1)のほうかな?
家政婦 は、
(‥‥この間100行。)
見た。
あ、助詞をうまく使えば両方の構文を実装できるやうな
気もしてきた‥‥‥。
たった一つだけ スタック制御だけ
なんでもないですage
>助詞をうまく使えば
それはForthよりもSmalltalkに近い、という説が。
tp://isweb21.infoseek.co.jp/computer/h_yanai/html/B8E5C3D6A5ADA1BCA5EFA1BCA5C9A5E1A5C3A5BBA1BCA5B8.html
リンク先を読みました。
似たような(たのしそうな)議論をしてますね。(^^
1)の構文のように複文かましてオブジェクトに流し込むという感覚は、
Smalltalkぽいわけですね。むー。
「スタックから何個オブジェクトもらうかはウチで決めさせてもらいますわ。」
の2)の構文のほうが確かにForthらしいか。
助詞によるパラメタのコントロールは魅力的だけど、スタック操作の実装を考えると、
オレみたいなへたれには荷が重いかも‥‥。
のんびり考えてみます‥‥。
salvage
312 PICK
DROP
モプースの日本語化がわずかばかり進みましたのでご報告。
anObject someMessage 型のメソッド呼び出しが出来るようになりました。
↓現在こんな感じ
need モラセト
☆ メソッド呼び出しのテスト
クラス「 2chキャラ 」は「 オブジェクト 」を継承し
『 ハァハァ: とは " ハァハァ" を 文字列表示 』
を実装する
クラス「 モナークラス 」は「 2chキャラ 」を継承し
『 話せ: とは " オマエモナ〜" を 文字列表示し 自分 が ハァハァ。 』
を実装する
クラス「 ギコクラス 」は「 2chキャラ 」を継承し
『 ハァハァ: とは " ハゥッ" を 文字列表示 』
『 話せ: とは " 逝ってよし!" を 文字列表示し 自分 が ハァハァ。 』
を実装する
モナークラス モナー
ギコクラス ギコ
単語 駄スレ { 値 -- } を
ここから
値 から 1 を 引く → 値
値 が 0 以上
ならばその間
改行し
値 を 2 で 割った余り が 1 と 等しい
ならば
ギコ が
さもなければ
モナー が
つぎに
話せ。
を 繰り返し実行する
と定義
endload
で、実行結果は↓
10 駄スレ
逝ってよし!ハゥッ
オマエモナ〜ハァハァ
逝ってよし!ハゥッ
オマエモナ〜ハァハァ
逝ってよし!ハゥッ
オマエモナ〜ハァハァ
逝ってよし!ハゥッ
オマエモナ〜ハァハァ
逝ってよし!ハゥッ
オマエモナ〜ハァハァ
モナー が 話せ。
なら動的束縛。
話せ: モナー
なら静的束縛です。
助詞は実は読み飛ばしてます。
へたれでスマソ。
52 PICK
>>22 見てる分にはなかなか面白いかも。
Mopsってのは知らないけど、ForthとSmallTalkの
知識のみでだいたい理解出来るし。
>> 46
自分でいうのもなんですが日本語化したリストを打ち込むのは正直メンドイ。
でも見た目重視なので名前付きパラメタへの代入記号が→だったりします。(w
SmalltalkはSqueakを以前ダウンロードしてみたことがありますけど、継続して
使ってみてないのであんまり知りません。
Smalltalkのメソッド呼び出しの語順を逆にしたものがMops‥‥?
48 :
デフォルトの名無しさん:01/11/20 21:14
見るだけで満足できるスレだな。
良スレage
さげ!
今後は新言語を発明しなかった奴にベストプログラマー賞をやれや。
>>49 アイヤー、Mopsはちっとも新言語じゃねぇっす。
Neonという名前の商用製品だった頃を含めればMac用開発言語の中でもカナーリ古株ですね。
マイナーだけど。
でもsage。
Transcript show: 'Hello World'
で、Transcriptオブジェクトにshow:メッセージを、
引数'HelloWorld'で送る。
Mopsの逆になってる?Mops知らんので良くわからん。
モナーが話せ。
という事は一緒に見えるが。引数がある時は
モナーが 'Hello World' と文字列話せ。
となる、という事か?
ギコとモナーの所のスタックにあるオブジェクトの種類で多態、
ってのは面白い気もする。
でもやっぱりはやらんだろうなぁ、こういう言語は。
Mops的に表現すると、
" Hello World" show: Transcript
になります。パラメタ メッセージ オブジェクトの順。
コンパイラ部分にパッチをかましたオイラの日本語化Mopsだと
↓
クラス「 モナークラス 」は「 オブジェクト 」を継承し
『 セリフを話せ: とは 文字列表示 』
を実装する
モナークラス モナー
" Hello, world" と モナー は セリフを話せ。
=> Hello, world
みたいな感じです。
つまり、パラメタ オブジェクト メッセージ の順。
もともとのMopsの構文も生きているので、
" Hello, world" と セリフを話せ: モナー
も実行できますけど。
>>52 補足すると、Mopsが、インプットストリームから切り出したワードの
最後が『:』である事から、オブジェクトに対するメッセージか否かを
判別している箇所を拡張して、最後が『。』ならスタックトップの
オブジェクトへメッセージをsendするようにコンパイルしてます。
だから、パラメタはオブジェクトより前にないとダメです。
将来的に
>>33の1)みたいな構文ができると楽しいとは思います。
あと趣味でやってみてるだけなので実用性は期待してませンです。(w
>>50 でもNeonの頃は単一継承で動的束縛のみだったと思う。
ドキュメントのどこかで読んだだけで直接当時を知ってるわけ
ではないけれど。
オーストラリアのおじさんが残りの仕様を付け足した。
同じNeonから別れたYerkってのもあったハズ。
55 :
デフォルトの名無しさん:01/12/08 13:10
自分 で 上げ。
普通のFORTHスレってないの?
勉強してみたいんだけど。
ふつーにGNU Forthのドキュメントでも読めば
十分勉強できると思うよ。
58 :
デフォルトの名無しさん:01/12/08 20:15
59 :
デフォルトの名無しさん:01/12/08 20:20
あげよう子供ライオン
>将来的に
>>33の1)みたいな構文ができると楽しいとは思います
ところで、実際やろうとすると、どうやればいいんでしょうね。
文法については、レシーバーをメッセージの直前や直後に置くという文法にしないかぎり
やっぱり何らかの印がないとレシーバーだと判別できないんで。
あるいはレシーバーだけ「印がない」という案もあるが。
つまり助詞案みたいに、述語は「。」が、引数は「、」が、つくので
それ以外がレシーバーだ、という案。
ちょっと読みにくそうだけど。
コンパイルしたものの動かしかたについては、どうすればいいんだろうな。
postscriptでいう「mark」のようなものをstackに積み、
ここから1つのmessage sendingが起こる、ということを
おしえればいいだろうか。つまりstackに
mark receiver param1 param2 ...
と積まれた状態でmessageを実行すると
stacktopから(最初にみつかる)markまで掘り下げて
receiver とparamを拾ってくる、という。
これできちんと動くかどうかは検証してないけど。
>>57 本を何冊か読んだけど途中からわからなくなります。
8ビットで遊んでみたいからforthみたいな小さい言語はぴったりだと思うのですが
逆ポーランドにいまだ馴染めません。
61 :
デフォルトの名無しさん:01/12/08 20:27
>>59 え〜2つほど案があります。
文法的にはどちらも、
anObject mark1 param1 param2 paramN mark2 someMessage
になります。
1) オブジェクトスタック案
実行時にmark1がスタックトップをオブジェクト専用スタックにpushし、
mark2 がオブジェクト専用スタックからpopしてスタックトップに戻す。
2) 無名ワード案
コンパイル時にmark1とmark2にはさまれた部分を「無名ワード」(w として定義。
実行時にその無名ワードを呼び出すようにコンパイルする。
どちらにしてもmark2がないと
>>42で実装した文法と混在しつつ複文に対応することが出来なかったりします。
で、mark1とmark2に助詞をあてればよいのかな?と思っていますが、
実装するヒマがありません。
63 :
デフォルトの名無しさん:01/12/09 00:31
>>62 そのmark1,mark2って、
その位置を「anObjectの後」「someMessageの前」じゃなく
「anObjectの前」「someMessageの後」に換えると、
あら不思議、Lispみたいな言語になってしまう(笑)。
語順は逆だけどね。
リアル厨房だけど。いれさせて。
OpenFirmwareについてはちょっと関心あるなぁ。
あれってForthインタプリタなんでしょ?
それでいてブートローダ?BIOS?
…知識はないけど関心なら。(汁
65 :
デフォルトの名無しさん:01/12/09 01:04
BIOSにforthみたいな「(作るのが)簡単な」言語をいれるのは
わりとメジャーらしいですよ。
同様の理由で、ブートローダーにbasicを採用してるマシンってのも見たことがある。
Bload 0?????H : call 0?????H でlinuxがブートしたのを見たときは、さすがに笑いころげた。
同じくらい作るのが楽な言語といえばlisp系もなんだけど、
あれもブートローダーにしてる人(会社)は居るんだろうなあ。
66 :
デフォルトの名無しさん:01/12/09 01:27
>>64 > あれってForthインタプリタなんでしょ?
> それでいてブートローダ?BIOS?
BIOSというよりはブートローダですね。
FORTHを知らなくてIF文の書き方に戸惑っているデベロッパが世界中にいそうだ。
67 :
デフォルトの名無しさん:01/12/09 01:42
>>65-66 あぁ〜。ますますゾクゾクしてきますな。
OpenFirmwareのプロントがForthインタプリタと知り、
実際に使ってみた時、ちょっと感じるものがありましたが…
ブートローダってことはちっちゃいOSといってもいいのかなぁ。
勉強してみます。
>>63 もちろん「無名ワード」はLispからのパクリです。
無名ワード案でいくと、ForthとLispとSmalltalkを多重継承して見た目が
日本語のキモい言語になる?
でも実装が面倒クサそう。
FreeBSDのブートローダがForthで書かれている。
Forth総合スレ欲しいよ。
70 :
デフォルトの名無しさん:01/12/09 02:06
GNU GRUBも正直Forthなら良かった。
いまの設定ファイルは記述力が低すぎる。
72 :
デフォルトの名無しさん:01/12/09 13:30
>>70 名称の問題ですね。mops知らん人は通りぬけちゃうかも。
ここが一杯になった暁(くるのか?)には「総合スレ」の名で大々的に起こす、では
やっぱりおそすぎますかね(^^;
スレに「別名つける」機能とか「リネームする」機能とかが
あればよかったのにな。ただ、あったらあったで変に濫用するやつが
後たたなくて困るだろうけど。
forthのコードって出てますか?
富士通とか日立の8ビットパソコンに移植してみたいんですけど。
あとWIN−CE用のforthがあると助かります。
深度25 sageるけぇのぉ
>>75 「forthのコード」
ソースのことか?だったら
>>73-74のリンクにあるんじゃないんかのぉ。
不思議じゃわい。もののみごとに。
77 :
デフォルトの名無しさん:01/12/09 22:24
物凄い勢いでオブジェクト指向FORTH製OSが立ち上がる画像キボンヌ
age
78 :
デフォルトの名無しさん:01/12/10 01:15
盛り上がんねぇなぁ。いっちょあげ。
さすがマイナー言語(w
80 :
デフォルトの名無しさん:01/12/10 03:15
ちょい勉強してはじめてわかったけど、このスレの
タイトル、Forthのcolon definitionにちなんでるのね。
ダセェ顔文字かと思ってたよ…
なるほど。気づかなかったよ。悪くないね。
>>82 ネタがあるならageようよ。(藁
漏れの所では試せません。スマソ。
>>26 パクリました。許可して。
42 pick
>R
今すぐL1-AしてOpenBootだ!
89 :
サルベジ:01/12/13 00:52
今すぐ再起動 -> Command+Option+O+F してOpenFirmwareだ!
そんで最後にFDISK/MBRしてCtrl-Alt-Delだ!
>>42みたいなコードをANS Forth上で実行できるようにする代物を
>>82のリンク先のソースをベースにして今書いてます。
とりあえずCLASS10.zipのほうをもとにしているので多重継承はまだダメですが
その他の部分はそれらしく動作しているみたいです。
日本語の処理とか、いい加減にしかやってないのでハッタリもいいところですが。
たぶん明日ぐらいには公開できると思います。
GikoForthという名前にしようと思っているオイラは逝ってヨシ。
92 :
デフォルトの名無しさん:01/12/15 09:28
期待アゲ
93 :
デフォルトの名無しさん:01/12/15 11:42
期待age
パーサーを全くいじってないので、半角スペースで
分かち書きしなきゃいけないです。メンドイです。
pForthの場合、辞書にはUPPER処理されて登録されてしまいますが、
なんとなく動きます‥‥‥。
へたれですまぬ‥‥。
96 :
デフォルトの名無しさん:01/12/15 19:38
>>96 出力先をファイルにしてみてヨ。
でも結局、日本語を正しく扱えるANS互換FORTH処理系がないと
意味なしカモ‥‥。
pForthのソースを見ると、パーサーと辞書登録に関する部分はCで
書かれてるんだよね。
pForthはパブリックドメインなので付属のソースコードを書き換
えて日本語対応にすればいいんだけども。
MPWどこにしまっちゃったかなぁ。
98 :
デフォルトの名無しさん:01/12/17 02:20
>>97 MacOSXに移ろうYO!
NSDictionaryで一発さ!HAHAHA!
>>98 ソウナノカー。
でもオイラまだMacOSX持ってないのヨ。ホスィーヨォ
ってか、土曜日にうぷろーどしたソースにバグがアターヨ。(恥宇津氏
コソーリなをしたよ。
へたれでスマソ‥‥。
>>100 すぐに実行できるバイナリは用意したいとは思うけれども、
今、忙しいのでかなり気長にお待ち下さい。
あとオイラにはマク用しか用意できません。
(だれかオイラにG4を‥‥iBookでもいい‥‥クレ。)
あなたがマカーならフォントパチーンをインストールして、
フォント置き換えアプリにpFORTHを指定してから、
pFORTHと同じフォルダにGiko.fthを置き、pFORTHの
コンソールから
include Giko.fth
と打ち込んでreturnキーを押せば、取りあえず試してみる
ぐらいのことは出来ますよん。
たまにはageんとな。
>>22 MacOSXに移ろうYO!カマーン!
>>102 よっっしゃぁ!Let's OS Xっ!!
‥‥とまあいけばヨシ。
>>101であんなこと書いてますが結局、MPWでビルドし直すことに今日
手を付けてしまいました‥‥。
今宵のうちに例の場所にうぷしときます。
OSXなのでなんとも言えないです。
Classic捨てたし。
昔もよかったなぁ…MPWか……
>>104 あぁ!そうだったノカ〜。
Classic捨ててる人もいるのねん。
いま試そうとおもったんだけど、SIOWアプリはCarbonでビルドできないみたいねぇ。(鬱
すまないが、オイラがG4を手にする日までしばらくお待ちを。
‥‥
>>98が自分でOS X上にビルドすると言う手もあるゾ。(ボソッ)
うぷしました。
でもpForthをMPWのSIOWアプリにビルドし直して、
Giko.fthを自動で読み込むようにしただけ‥‥。
‥‥しかも今どきクラッシックアプリ。
‥‥‥‥‥へたれでスマソ。
どうよヽ(´ー`)ノ
108 :
名無しさん@Emacs:01/12/24 13:42
tile-forth という処理系には、forthで書かれたオブジェクト指向拡張
がサンプルとして入っている。
ftp://ftp.forth.org/pub/Forth/Compilers/native/unix/tile-forth-2.1.tar.z message position ( x y self -- )
message write ( self -- )
message read ( self -- )
Object subclass Point ( x y -- )
long +x ( self -- addr)
long +y ( self -- addr)
method initiate ( x y self -- )
dup >r super initiate r> position
;
method position ( x y self -- )
tuck +y ! +x !
;
method where ( self -- x y)
dup +x @ swap +y @
;
method write ( self -- )
dup super write where ." x: " swap . ." :y " .
;
subclass.end
10 10 Point instance aPoint
aPoint write cr
-10 -10 aPoint position
aPoint write cr
aPoint read
cr
こんな感じ。
109 :
デフォルトの名無しさん:01/12/24 16:20
>>108 おぉ。なんか見やすいっすな。やっと第4世代って感じですな。
ちょっと触ってみます。サンクス。age
>>108 をを!
tile-forthぢゃないですか。
一応オイラもチェック入れてます。
tile-forthのoop拡張はselfを常にスタックトップに残すんでしたっけ?
>>110 自分でかいといてスンマヘン。
サンプル良く見ればわかりました。
>>107 GikoForthのクラッシク版はとりあえず、辞書に日本語のワードが
UPPER処理されないような修正だけしてソース付きで、
>>94 のリンクの場所に置いてますです。
‥‥G4買うべく働いてます。(;´Д`)
なるほろ。
tile-forthってプロトタイプベースなわけですか。
で、クラスに基づく継承もできる、と。
勉強になりました。
tile-forthってまだ生きてたの。
俺が知る限りUNIXプラットフォーム初のForth処理系だった。
でも、ANS標準以前の言語仕様だったような気がするなぁ。
>>114 ソースの拡張子から想像するにFORTH-83系のようです。
まあ、FORTHは生みの親が「標準化なんてツマラン」みたいなこと
言ってるし、そのせいか、ANSはいつまでたってもドラフトのままだし。
>115 C.Mooreのオッちゃんな。
尊敬してるけど、ラディカル過ぎて正直ついていけない。
COLOR FORTHとかまで逝っちゃうと、FORTHの本質って結局何?
ってなもんです。
>>116 Color FORTHはついてけないです。
文字コードなんか5ビットもあれば十分とか言ってるし。(;´Д`)
世の中の流れと全然逆だよう。>ムーアのオッチャン。
>117 なんかストレージはフロッピー一枚で十分とか言ってるしなぁ。
あ、でもForthチップの仕事とかは面白そうだったのだが、今どうなのだろう?
120 :
デフォルトの名無しさん:01/12/25 00:27
>119 興味深いURLをサンキュウ
HarrisのRTX-32とかは航空宇宙分野で結構使われたようです。
大昔にNovix NC4000のアーキテクチャに感動したことがあるんです。
パラメタスタックとリターンスタック専用データバスがあったり
一機械語中にFORTHのワードが複数埋め込まれててなかなか速そう。
>>120 > HarrisのRTX-32とかは航空宇宙分野で結構使われたようです。
かっちょエエ〜!
さすが組み込みに強いFORTH(藁
>>108 う〜ん。インスタンス変数の内容をとってくるために毎回selfから計算し直す
のはメンドクサイ気がしますが‥‥‥。
123 :
デフォルトの名無しさん:01/12/28 00:11
forthのオペレーターわけわかんないんだけど、
>>108のコードを説明してくれないかなあ・・
124 :
デフォルトの名無しさん:01/12/28 19:42
>120
遠い昔、「標準FORTH」(だったと思う)を読んで、自分でも
8bitパソコン上にFORTHを実装しかけたことがあるんですが、
インナーインタプリタのコードを書きながら、
「最初からCPUがindirect threaded codeを解釈すりゃいいのに。」
と思ったものです。
FORTHマシンは実在していたんですね。ええモンを拝ませてもらいました。>119
>>108じゃないんだけど、少し基本的なオペレータを解説してみる。
「(」と「)」に挟まれた部分はForthではコメント扱いだけど、
あるワードの操作によってスタックの状態がどう変化するか、
ということをあらわすのに伝統的に使われる。
( a b -- c )
とあったら、スタックトップ(TOS)のbとそのひとつ下のaが操作に
使われ、cという値がTOSに返る、という意味。
@ ( addr -- n )
addr番地のメモリの内容をTOSに返す。
! ( n addr -- )
addr番地のメモリへnを書き込む。
dup ( n -- n n )
TOSを複製してスタックに積む。
swap ( a b -- b a )
TOSとその次を入れ替える。
tuck ( a b -- b a b )
TOSを2つ下に複製する。
>r ( n -- )
TOSを取り出しリターンスタックに積む。
r> ( -- n )
リターンスタックのトップの内容を取り出してパラメタスタックへ積む。
>>108のpositionというメソッドの呼び出しの時点ではスタックは、
x y self
となっているけど、tuckが実行されると、
x self y self
という状態になる。次に+yが実行されると、
x self y addr
になって次の!でaddr(+yに相当するインスタンス変数のアドレス)に
yが書き込まれてスタックは
x self
ここで+xが実行されると
x addr
になって、次の!でaddr(+xに相当するインスタンス変数のアドレス)に
xが書き込まれて無事終了。(ふー。)
whereメソッドその他は省略します。(w
つまり、
>>122のいうようにtile-forthのoop実装では、+xや+yは
毎回TOSのselfにオフセット値を足して実際のインスタンス変数の
アドレスを生成していると考えられるわけです。
ちと面倒か? Forthらしいといえばそうかもしれませんが。
127 :
デフォルトの名無しさん:01/12/28 20:37
>>125 アンタ…アンタ最高や!めっさ最高や!
125ワッショイ! 125ワッショイ! 125ワッショイ!
>>127 ま、祭りか? (w
かつて年季の逝ったForthプログラマはメモリ上の変数をなるべく使わず、
複雑な処理を様々なスタック操作を駆使して実現することに血道をageた
と伝えられます。
そーいったコードは、呪文のようにしか見えず一般のプログラマをForthから
遠ざける原因になったとも伝えられます。
129 :
デフォルトの名無しさん:01/12/29 00:21
祭だ祭だワショーイ
>>125 >>128 なんでスタックだけで?
「だって変数名考えんのメンドくさいんだもーん」
とかじゃないよね?
130 :
デフォルトの名無しさん:01/12/29 00:24
forthのスタックって、相対アクセスはできるの?
というかローカル変数ってあるの?
131 :
デフォルトの名無しさん:01/12/29 00:49
>>129 > なんでスタックだけで?
伝統的なForthのスタイルには局所変数が存在しないからです。
>>130 >forthのスタックって、相対アクセスはできるの?
スタックはスタックトップにしかアクセスできないが故に
スタックなのですぅ。
> というかローカル変数ってあるの?
>>129への回答に同じ‥‥‥ということでおしまいにしようか
とも思いましたが、実は最近のForthはローカルな変数も定義で
きます。また名前付きパラメタなどというForthらしからぬ機能も
あります。
132 :
デフォルトの名無しさん:01/12/29 01:09
久しぶりのレス流れだ!
ワッショイ!ワッショイ!ワッショイショイ!!
pForthの名前付きパラメタとローカル変数の宣言の例
: test { a b | c -- } a b * -> c c . ;
3 2 test
6 ok
「{」が名前付きパラメタの宣言の開始で、「a」と「b」が
スタック上の二つの数値に割り当てられる。(この場合aが3でbが2)
「|」以降「--」まではローカル変数の宣言部。
この場合cというローカル変数が一つ宣言されていることになる。
値を取り出すのは変数名を書くだけ。
代入は「->」という前置オペレータを使う。
ちなみに「.」はスタックトップをコンソールに数値表示するワードね。
Mopsも「|」が「\」という違いはあるけど同じ機能を持っている。
たぶん最近のForth処理系は相当する構文を持っていると思う。
134 :
デフォルトの名無しさん:01/12/29 01:29
いわゆるローカル変数はないけれど、Forth の機能の範疇で
スタック上に領域を確保して名前を付ける仕掛けを作ることは
できますね。
あと CONTEXT の VOCABULARY を切り替えるとかして変数の
セットを入れ替えるとかで代用可能かも。
VOCABULARY の機構って、ディレクトリに格納されたコマンドが
実行パスから検索されて実行されるのに似ている。
Forth の重要な機能一つだと思うのだが、あまり語られない。
8bitマイコン向けに作られた Forth だと、この仕掛けが省略されて
いたりしてずいぶん萎えたよ。
135 :
デフォルトの名無しさん:01/12/29 01:51
>>134 かろうじて思い出しました。辞書のリンクがツリー状になってるような
イメージでしょうか?
昔読んだ本の中のForthはそういう機能を持っていたような。
ああヤパーリ、ムーアのおっちゃンは偉大やったんやなぁ。
136 :
デフォルトの名無しさん:01/12/29 01:55
>>135 > ああヤパーリ、ムーアのおっちゃンは偉大やったんやなぁ。
時々奇妙奇天烈な事をお言いになりますが。
137 :
デフォルトの名無しさん:01/12/29 02:08
>>134 今確かめてみたら、
>>133のような名前付きパラメタってANS Forthだけで実装
できるんですね。なるほろ。
138 :
デフォルトの名無しさん:01/12/29 02:10
>135 ポピュラーだった FIG Forth だと一度に一つの VOCABULARY しか
探索できなかったと思う。
Forth 社の処理系は現在の ANS 仕様に近い強力な機能を持ってたみたい。
139 :
デフォルトの名無しさん:01/12/29 02:10
>>136 天災となんとかはカミ一重と昔からいいますし‥‥。(w
強烈な個性の持ち主であるn
途中で改行打っちゃった。
強烈な個性の持ち主であるのは確かですね。
141 :
デフォルトの名無しさん:01/12/29 02:19
>>138 Forthの処理系って微妙な方言がありましたよね。
ANS の CREATE DOES> に相当するワードなんかは、
FIGとかFORTH 83とかで全然違ったよーな。でもあまり覚えてないから
不確かですが。
142 :
134=138:01/12/29 02:26
>141 そうそう、良く知ってるねー。
FIG のやつは同じ事をするのにトリッキーでダーティな方法使ってた気がする。
やっぱり詳細は忘れてるので聞かないで頂戴な。
143 :
デフォルトの名無しさん:01/12/29 02:34
>>141 Forth の処理系って微妙どころか方言の嵐じゃないの。
カッコでくくってリスト処理すればなんでも Lisp、
ワードを並べてスタックに入れればなんでも Forth
ってように。
144 :
134=138=142:01/12/29 02:40
>143 まあ、ムーアのおっちゃんじゃないけど、
Forth のプログラミングってのは、その目的専用の新しい言語を
デザインするような作業だから、自由度さえ高ければ方言自体は
あまり問題にならないと思います。
>>143 組み込み済みのワードとユーザー定義のワードに差が全くないという方面では
Lispも似たような感じですね。Lispはワードとは言わないけれど。
>>144 自分専用のワードを作っていくと、新しい言語を作っているような気分になって
きますね。そこがグっとくるところ。
146 :
デフォルトの名無しさん:02/01/01 02:04
住人の少ないスレだが、貴様たち今年もよろしくage。
>ALL そういうことなので、本年もよろしく。
深夜になると、上がるのね。
148 :
デフォルトの名無しさん:02/01/01 05:45
forthで再帰処理とかってどう書くの?フィボナッチとか。
149 :
デフォルトの名無しさん:02/01/01 06:56
150 :
デフォルトの名無しさん:02/01/01 12:14
あけおめ。
>>149 なるほど。
それを実装してみようと思うんだけど、
自分自身へのポインタを返すってことでいいのかな?
>>150 内部インタプリタがindirect threaded codeを解釈するpForthの場合、
RECURSEのワード定義は↓
: RECURSE latest name> compile, ; immediate
latestは辞書の最新のエントリのネームフィールドアドレスをスタックに返し、
name>がそれを実行アドレスにしてcompile,が書き込みをやってる。
immediateワードなのでコンパイル時にこれらの作業が行なわれて、実行時には
普通ののワード呼び出しと変わらない形になってる。
でもこれ末尾再帰の最適化はしてないね。
Mopsの場合はネイティブコードコンパイラで、末尾再帰、末尾呼び出しなどの
最適化をごりごりやってるものだから、RECURSEの実装は複雑怪奇ですなぁ。
アセンブリコードの書き換えをやってるのかな?(PowerPCの機械語なんて知らないよぅ。)
RECURSE自身はやはりimmediateなワードです。
結局ただのジャンプ命令にコンパイルされる模様。
152 :
デフォルトの名無しさん:02/01/01 23:37
ムーアの法則age
>>149 なるほど。盛れも今forth系の言語1つ作ろうと思っているんだけど、
recurseとかsuperとかをどう実装すりゃいいか迷っていたんで、
それ参考にさせてもらいますです。
153 :
デフォルトの名無しさん:02/01/02 00:25
superのメソッドを呼び出す実装の仕方はOOPの流儀でいろいろだけど、
Neon/Yerk/Mopsの場合は、隠れたインスタンス変数としてsuperと
selfをオブジェクトは持っているというトリックを使ってるね。
ttp://www.zetetics.com/bj/papers/oofs.htm ↑ちと古いけどコレまで実装されたOO Forthの比較ページ。
参考にしてみるとおもしろいかも。
ここに載ってないGForthとかのOO拡張の一つにはインターフェースとかも
取り入れられているみたい。
あんまり真面目に調査してないので詳細はわからないけど。
いずれにしてもForth自身でOO拡張を記述できてしまうのがForthの良い所
でもあり悪い所でもあり‥‥‥。
154 :
デフォルトの名無しさん:02/01/02 00:26
forthでOOて、苦しくない?
155 :
デフォルトの名無しさん:02/01/02 00:40
>>154 う〜ん、漏れ的にはOOのないForthをもう使いたくない。Forthの良くないところは、
スタック上のデータの型によって異なったオペレータを使用しなければならないところ
だとオイラは思ってる。
OOがあると多態が使えるので型(=クラス)が違っていても同じメッセージを送る事が
できる。だからForthの欠点を補う事ができると思うんだよね。
156 :
デフォルトの名無しさん:02/01/02 00:52
>>154 ForthでOO拡張を書く事による実行効率の話だとするとNeon/Yerk/Mopsのモデルは、基本的に
静的束縛なのでOOなしのForthと比較してさほど変わらないとおもう。
動的束縛を明示的に行なう場合には8方向リストとハッシュの組み合わせでメソッドの検索が
が行なわれる。(CLASS10.zipでの実装方法)
ポインタ参照が少し増えるぐらいのオーバーヘッドだと思われ。
お好み次第で自分流のOOパッケージを作るのがよろしい。
ソースの字面的には Smalltalk や CLOS 程度の使い勝手のものは
作れると思う。
本当は、デファクトのForth-OOパッケージがあるといいと思うけど。
158 :
デフォルトの名無しさん:02/01/02 13:11
おそくてすまんがあけおめ。
>>155 少なくともoop好きな漏れとしては禿同。
親戚のPostScriptでいうところのポリモルフィック オペレータって考えかたですね。
ハードとかをゴリゴリいじるためには型情報を無視してプログラマが手作業で
データの意味を把握するほうが良いこともある(Cでおなじみ)けど、
その場合以外はデータ自体が型(つまりメッセージの解釈方法)について
自己主張してくれるほうが、コーディングが楽です。
>>156 不勉強ですまそ。8方向リストって初耳なのですが、どういうものですか?
双方向じゃなく?
8方向にポインタ(参照)がつながってるリストって、
リストというよりもハイパーネットワーク構造みたいで凄くないですか?
159 :
デフォルトの名無しさん:02/01/03 00:47
今日も深夜になったage
>>158 単にクラスの持つハッシュのテーブルの大きさが8というだけです。
英文で8way linkea listとあったのでつい書いてしまいましたがまずかったですね。
なんとなく「Forth系言語を自作しようスレ」になっていますね・・・。
160 :
デフォルトの名無しさん:02/01/03 01:09
ぜひ自作してくれ
161 :
デフォルトの名無しさん:02/01/03 01:11
後置記法って、
演算子についてはなんとなくわかるんだけど、
構文はどうなるの?
162 :
デフォルトの名無しさん:02/01/03 01:51
>>161 制御構文のこと?forthの場合、
(条件) IF (真のとき) ELSE (偽のとき) THEN
(終値) (開始値) DO (ループ処理) LOOP
BEGIN ( 永久ループ) AGAIN
BEGIN (ループ処理) (条件) UNTIL
BEGIN (条件) WHILE (ループ処理) REPEAT
標準的なのはこのくらいかな?
163 :
デフォルトの名無しさん:02/01/03 02:23
制御構文の実装について
制御構文のどのワードもimmediateつまりコンパイル時に即実行される。
後方へのジャンプはマーク時にアドレスをスタックにつんでおく。
BEGIN ←マーク
AGAIN ←スタックからアドレスを取り出しジャンプ命令を生成。
前方へのジャンプはジャンプ命令をとりあえずコンパイルしておき、
アドレスを書き込むべきアドレスをスタックにつんでおく。
IF ←条件ジャンプ命令を生成し書き換えアドレスをスタックに積む。
THEN ←スタックからアドレスを取り出し現在のアドレスを書き込む。
ジャンプと条件ジャンプはプリミティブで残りのワードはForth自身で実装できるよ。
164 :
デフォルトの名無しさん:02/01/03 03:22
うーん、なんかなじめないなあ・・。
>(条件) IF (真のとき) ELSE (偽のとき) THEN
って、本場の人が見てもなんか変だと思いますよね?
syntaxだけ普通にif (条件) then (真のとき) else (偽のとき)
に出来なかったのかな。
BEGINは前に書くんだし。
165 :
デフォルトの名無しさん:02/01/03 04:24
>>164 たった3行でお望みの構文に変更できるyo。
: ENDIF postpone THEN ; immediate
: THEN postpone IF ; immediate
: IF ; immediate
これで、
IF (条件) THEN (真のとき) ELSE (偽のとき) ENDIF
↑この構文に変更できる。これはマクロみたいなコードだけど、他にも
Forthは制御構文を好きなように自作可能だよん。
166 :
デフォルトの名無しさん:02/01/04 01:45
>>165 それだと標準のライブラリとか読み込む時に問題になるから、
: }ENDIF postpone THEN ; immediate
: }THEN{ postpone IF ; immediate
: }ELSE{ postpone ELSE ; immediate
: IF{ ; immediate
とかにしたら?
167 :
デフォルトの名無しさん:02/01/04 02:34
おれは大文字は嫌いだ全部小文字にしたい。
できる?
168 :
デフォルトの名無しさん:02/01/04 03:17
>>167 ていうかたいていのForthはCase insensitiveなので小文字で書いて可。
>>166の定義で
if{ 条件 }then{ 真の時 }else{ 偽の時 }endif
と書けるYO。
ありがと。
forth使ってみる。
170 :
デフォルトの名無しさん:02/01/15 02:55
たまにはあげんとな。いかんぜよ。
171 :
デフォルトの名無しさん:02/01/17 01:42
Forthハァハァ
172 :
デフォルトの名無しさん:02/01/17 04:02
:
>>171 FORTH = IF
" ハァハァ"
ELSE
" フーン"
END
;
173 :
デフォルトの名無しさん:02/01/18 01:09
んがとっと
んが とっ と
174 :
デフォルトの名無しさん:02/01/18 01:29
:
>>172 FORTH = IF
" ハァハァ"
ELSE
" フーン"
THEN \ ←ENDぢゃないぞ。
;
175 :
デフォルトの名無しさん:02/01/18 02:05
: fibo ( ● ´ ー ` ● )
dup 2 < if drop 1 else dup 1- recurse swap 2 - recurse + then
;
>>174スマソ。普通のFORTH使ったこと無いんで間違えました。
177 :
デフォルトの名無しさん:02/01/19 23:01
Win用の厨にでも使えるForth処理系キビンヌ
178 :
デフォルトの名無しさん:02/01/27 19:09
生きてる?
179 :
デフォルトの名無しさん:02/01/27 20:27
「フォース」って書いちゃ駄目?
>>178 ごめん、半分死にかけ‥‥‥。
春になったらなんとか‥‥‥。
181 :
デフォルトの名無しさん:02/01/27 23:47
182 :
デフォルトの名無しさん:02/02/01 23:51
ficlってoopなの?
183 :
デフォルトの名無しさん:02/02/03 20:41
184 :
デフォルトの名無しさん:02/02/03 21:39
いや、FORTHって豪快だな〜(笑
Perlの上を行ってるな〜
なんでも突き通せは思想なのかもなあ。
なんか関数型を使ったあと使うとめまいがしそうだ。
#FORTHに悪意のある書き込みではないので念のため。
確かにとんがってる感はある。
あげとくよ。
187 :
デフォルトの名無しさん:02/02/09 00:29
もいっちょ
結局さあ、使ってる人いるの?
おれスタック操作怖くてできない。
FCodeを語れそうなスレはここだけですか?
190 :
デフォルトの名無しさん:02/02/09 18:51
空ageしかできんなぁ。
191 :
デフォルトの名無しさん:02/02/10 00:58
>>188 え〜と、Mac用のフリーソフトを作ったことならあります。
でも普通のアプリケーション開発にFORTHを使う人は大変めずらしいと思いマスです。
Open FirmwareとかOpen Bootとか向けにFORTHで書かなければならなくなった
デバドラ屋さんは結構いるかも知れませんが職業プログラマじゃないので知りません。
スタック操作は慣れると不定個の返り値をもつ関数とか引き数としてスタックに積んだ
値を使っても使わなくても良い多態とかトリッキーなコードを書いてしまうという
両刃の剣。でも面白いですよん。
http://www.jwdt.com/~paysan/mini-oof.html よりわずか12行のOOP拡張
: method ( m v -- m' v ) Create over , swap cell+ swap
DOES> ( ... o -- ... ) @ over @ + @ execute ;
: var ( m v size -- m v' ) Create over , +
DOES> ( o -- addr ) @ + ;
Create object 1 cells , 2 cells ,
: class ( class -- class methods vars ) dup 2@ ;
: end-class ( class methods vars -- )
Create here >r , dup , 2 cells ?DO ['] noop , 1 cells +LOOP
cell+ dup cell+ r> rot @ 2 cells /string move ;
: defines ( xt class -- ) ' >body @ + ! ;
: new ( class -- o ) here over @ allot swap over ! ;
: :: ( class "name" -- ) ' >body @ + @ compile, ;
使用例:
クラス定義
object class
cell var text
cell var len
cell var x
cell var y
method init
method draw
end-class button
メソッド定義
:noname ( o -- ) >r
r@ x @ r@ y @ at-xy r@ text @ r> len @ type ;
button defines draw
:noname ( addr u o -- ) >r
0 r@ x ! 0 r@ y ! r@ len ! r> text ! ;
button defines init
継承
button class
end-class bold-button
: bold 27 emit ." [1m" ;
: normal 27 emit ." [0m" ;
:noname bold [ button :: draw ] normal ; bold-button defines draw
インスタンスの生成とメソッド呼び出し
button new Constant foo
s" thin foo" foo init
page
foo draw
bold-button new Constant bar
s" fat bar" bar init
1 bar y !
bar draw
194 :
デフォルトの名無しさん:02/02/15 23:18
>>193 クラス定義はおおっ!って感じだけど、
メソッド定義以降、わけわからんのでガクゥ・・
このへんから
>:noname ( o -- ) >r
>r@ x @ r@ y @ at-xy r@ text @ r> len @ type ;
>button defines draw
forthの日本語の仕様書/規格書ってオンラインで無いですか?
例えば、193のコードを動かすには最低限、どのレベルの規格に準拠している
必要がある、とか。
なんだかその辺が混沌としてるイメージがあって、
なかなか取っ掛かかれないのれす。
>>194 >>192のOO拡張コード自体はANS Forth上で動作します。
pForthでクラス定義が可能な事を確認しました。
GForthのライブラリには上記コードがOO拡張パッケージの
一つとして付属しているみたいです。
‥‥ANS Forthの日本語仕様書はWebで見かけた事がないですねぇ。
196 :
デフォルトの名無しさん:02/02/17 01:53
>>194 :noname は無名ワードの定義開始ワードですぅ。セミコロンまでの部分がコンパイルされますが、
通常のコロン定義と違って特定のワードにバインドされません。
その代わりに実行アドレスがスタック上に残ります。ANS Forthが標準で持っているワードです。
( から )まではコメントです。
>rはパラメタスタックのトップをPOPしてリターンスタックにPUSHするワードです。
メソッド呼び出し時のパラメタスタックのトップにはオブジェクトが積んであるはずなので、
オブジェクトをリターンスタックのトップに移したということです。
r@はリターンスタックのトップを複製してパラメタスタックにPUSHするワードです。
リターンスタックのトップに積んだオブジェクトは保持されたままです。
つまりこの文脈ではr@はselfに相当しているわけです。
r@ x @
でインスタンス変数xの内容をパラメタスタックに積む、という動作になります。
at-xyはカーソル位置を移動するワード(たぶん)。r>はリターンスタックのトップをPOPして
パラメタスタックにPUSHします。リターンスタックをワードが呼ばれた時の状態に戻しておかない
と暴走します。(゚∀゚)
セミコロンで定義が終了したあとのスタックトップには先ほど定義した無名ワードの実行
アドレスが残っていますから、それをbuttonクラスのdrawメソッドにバインドするのが
button defines draw
の部分です。
197 :
デフォルトの名無しさん:02/02/17 01:56
え?スタックって何本あるんですか?
今までのお話だと、
リターンスタック
パラメタスタック
だけですか?
単に「スタック」というと、どれのことですか?
198 :
デフォルトの名無しさん:02/02/17 02:00
単にスタックと言うとパラメタスタックのコトです。
伝統的にはパラメタスタックとリターンスタックの二本ですが、流れ制御用のスタック
を持っていたり、float型専用スタックを別に持っている実装も存在しますね。
199 :
デフォルトの名無しさん:02/02/17 02:03
>>198 なるほど。ありがとうございます。
分けるのはやっぱり効率良いからですかね。
200 :
デフォルトの名無しさん:02/02/17 02:11
>>199 > 分けるのはやっぱり効率良いからですかね。
そうですね。パラメタとリターンアドレスが混在してしまうと、スタック上のデータの
操作が複雑になってしまいますし。
流れ制御用スタックについても同様な理由のようです。
float型は精度や実装によってスタックの1cellのサイズが通常の整数型と異なる
場合があるというのが理由かと思われます。
201 :
デフォルトの名無しさん:02/02/20 19:17
>>192に対する構文糖(5行)
: :method :noname postpone >r ;
: ;method postpone r> postpone drop postpone ; ; immediate
: self postpone r@ ; immediate
: get @ ;
: set ! ;
↓使用例。ちょっとだけ見やすい?
object class
cell var x
cell var y
method init
method print
end-class point
:method ( x y -- )
self y set
self x set
;method point defines init
:method ( -- )
self x get .
s" : " type
self y get .
;method point defines print
point new constant foo
10 20 foo init
foo print
202 :
デフォルトの名無しさん:02/02/21 01:45
Forthチップ、Forthマシンがあるのなら、オブジェクト指向Forthチップと言うのは無いのですか。
116で「FORTHの本質」という言葉が出てきましたが、
「仮想マシンのアセンブラであり、かつ構造化言語」というのがFORTHの本質だと思っています。
「オブジェクト指向FORTH」の名前で
「仮想マシンのアセンブラであり、かつオブジェクト指向言語」
つまり、チップが作り得るものを想像します。
203 :
デフォルトの名無しさん:02/02/21 20:38
204 :
デフォルトの名無しさん:02/02/21 23:07
>>202 オブジェクト指向拡張部分をROMに焼いてチップ上に乗っけちゃえば
それっぽく見える代物になるか?
デムパっぽいな〜。
Color Forthもデムパっぽいけどナ〜。(´Д`)
205 :
デフォルトの名無しさん:02/02/21 23:15
夢でも見ているのか。
このスレの稼働率とは思えない
206 :
デフォルトの名無しさん:02/02/21 23:37
207 :
202の名無し:02/02/22 16:46
Mopsのチップというのは作れるのですか。
>202
Java や Smalltalk のVMとか、Lispチップとかそんな感じじゃないかな。
Mops チップありでしょう。需要はないけど。
209 :
デフォルトの名無しさん:02/02/22 23:11
LISPだと汎用の内部イテレータ(map-carやら)が用意されてますけど、
forthで一般的なやつって無いですか?
210 :
デフォルトの名無しさん:02/02/23 00:21
>>209 Lispのmapに相当するような汎用イテレータですか?
素のままのForthではスタックへのアクセス以外はメモリへのダイレクトな
アクセスのようなものなので、「汎用的なイテレータをこなすワード」というよりは
汎用的なアクセサをもつ抽象化された「データ構造」自体が存在しないような‥‥‥。
いや、スタックがあった‥‥‥(´Д`)
Mopsの場合はクラスライブラリでイテレータ関連の機能に対応してるかな。
sequenceクラスのインターフェース(多重継承とかで)を持っていれば、
BEGIN each: <obj> WHILE <do something to the element> REPEAT
みたいなことは出来ます。
211 :
デフォルトの名無しさん:02/02/23 01:15
なんだなんだ?何が起こった?業界に異変?
211の脳内革命を確認。
↓似非map?ぽいものを定義してみた。
0 value SavedDepth
: (( depth -> SavedDepth ;
: )) depth SavedDepth - ;
: map ( P1...Pn n xt -- Q1...Qn n )
over >r >r
BEGIN dup 0 > WHILE swap r@ execute r> r> rot >r >r >r 1 -
REPEAT
drop r> drop r@
BEGIN dup 0 > WHILE r> r> -rot >r 1 - REPEAT
drop r> ;
使い方
・スタック上に一次元配列を作る。
(( 1 2 3 4 5 ))
各要素の後に要素の数をスタックに積んだ状態になる。
上の例だとスタックの状態は: 1 2 3 4 5 5
・配列の要素一つに対する操作用ワードを定義する。
: e++ 1 + ;
↑上のe++はスタックトップの値を1だけ加算して返す。
(( 1 2 3 4 5 )) ['] e++ map とすると、
(( 2 3 4 5 6 )) がスタックに返る。
: countUp ['] e++ map ;
と定義すれば、 (( 1 3 5 7 )) countUp で、
(( 2 4 6 8 )) がスタックに返る。
215 :
デフォルトの名無しさん:02/02/23 09:55
>>215 世界征服はJava VMにまかせた!!(゚∀゚)
217 :
デフォルトの名無しさん:02/02/23 17:26
>>215-216 和んだ。
ていうかさ、変数使わずにスタックだけでガシコンガシコン
プログラム組んだら、何がよくなるの?
218 :
デフォルトの名無しさん:02/02/23 17:39
>>213の定義だと評価の順序が右から左なので左から右に評価するように変更。
: mapl ( P1...Pn n xt -- Q1...Qn n )
swap dup >r
BEGIN dup 0 > WHILE rot r> swap >r >r 1 - REPEAT
drop r@ swap >r
BEGIN dup 0 > WHILE r> r> r> -rot >r dup >r execute swap 1 - REPEAT
drop r> drop r>
;
サンプル↓
: dspNum ( n -- n ) dup . ;
: tpl ['] dspNum mapl ;
と定義した時、
(( 1 2 3 4 5 )) tpl
で、
1 2 3 4 5
と表示される。
220 :
デフォルトの名無しさん:02/02/27 23:49
221 :
デフォルトの名無しさん:02/02/28 00:49
>220 人気投票最下位...
最下位ではぬゎーいっ!!
18人エントリー中の9位であーる。
9位入賞と言ってくれ。
でないと泣く。
223 :
デフォルトの名無しさん:02/03/01 21:40
++forth
224 :
デフォルトの名無しさん:02/03/06 22:08
Forth.NET
#include <stdio.h>
#define cmdin ">>"
#define stksize 256
227 :
202の名無し:02/03/11 02:08
手続きもオブジェクトにしてifもwhileもメッセージと言う具合にできるでしょうか。Smalltalkのように制御構造もメッセージで実現するわけです。もしかしたらその方が実装が簡単になりませんか。
‥‥‥‥‥‥起きた!
>>227 Smalltalkのようにすべてがオブジェクトな世界なら、その方が美しくてイイ気がします。
‥‥‥Forthのことは忘れて一から独自言語にしてしまいますか。
比較演算子がスタックの上にbool型のオブジェクトを生成すればいいのかな?
でifTrue;メッセージをsendするという具合に。
手続きオブジェクトがレシーバになるという実装もアリかも‥‥‥。
‥‥‥でも実装の手間の割に効率は良く無さそうなのでヤル気が萎えるです。
アリモノのif else thenでいいぢゃん、とForthプログラマとしては考えてしまいます。
でもライブラリとかのコードを書くときには、簡潔で見栄えの良い表記になるかも。
(実装というかコード記述が楽になるのはこのレベルに達したときですよね。)
ところで、手続き渡しをしたいときにForthプログラマは伝統的に、
['] someWord
みたいな感じで、あるワードのエントリをスタックに積んでおいて、適当な時に
executeしていたわけですが、もう少し真面目にブロッククロージャに相当するモノを
実装するというのはイイかもしれないです。
急な思いつきでGikoForthを非分かち書き日本語風に
書けるようにしてみますた。
クラス「 ギコハニャ〜ン 」は「オブジェクト」を継承し
『 話せ: とは"逝ってよし"を文字列表示し改行』を実装する
クラス「 ギコフッサール 」は「ギコハニャ〜ン」を継承する
ギコハニャ〜ン ギコ
ギコフッサール フサフサ
ギコが話せ。
フサフサが話せ。
みたいに。
内部的には非分かち書き→分かち書きの処理をかましただけなんですけど、
該当部分はGikoForth自身でGiko.fth内に書いてあるので、Project Builderを
持ってなくてもGikoForth自身でいじって遊べまふ。
>>226のリンク先にうぷしてあるので、存分にいぢって下ちい。
230 :
202の名無し:02/03/13 03:00
条件分岐のネストで厄介なことになりそうです。
条件分岐の構文としては
条件成立時の手続き 条件不成立時の手続き 条件判定手続き ifメッセージ
(条件成立時の手続き、条件不成立時の手続き、条件判定手続きをスタックに積んで、
スタックトップの手続きオブジェクトがifメッセージを受け取る)
と言うものを考えていました。しかしこれで二つの条件分岐をネストすると
後から実行される条件判定が前に来てしまいます。
先に実行されるものが先に記述される上手い構文があるか、
それともこれこそオブジェクト指向FORTHらしい構文と思うか、
もう少し考えてみます。
>>230 _{ ." true" } _{ ." false } _{ c true = } :if
上のような文法を持つ架空スタック言語があったとして、
_{ ." true1" } _{ ." false1" } _{ c1 true = }
_{ ." true2" } _{ ." false2" } _{ c2 true = } :if :if
c1,c2共にtrueの時こういう風に実行しようとすると、
true2
true1
という順序になってしまうということでしょうか?
自然です。‥‥それでこそスタック。
と、いう冗談は置いておいて、
_{ ." true1" } _{ ." false1" } _{ c1 true = } :if
_{ ." true2" } _{ ." false2" } _{ c2 true = } :if
のように単純に並列ではダメなのですか?
>>226 コソーリ非分かち書きのバグ潰しをしました。
しばらくまた放置するとおもいます‥‥‥。
ではでは。
他の言語によくある構文で
if c1 then
if c2 then true2 else false2 endif
else
else1
endif
と言うケースではc1の判定の後にc2の判定が行われますが、
_{
_{ ." true2" } _{ ." false2" } _{ c2 true = } :if
} _{ ." false1" } _{ c1 true = } :if
とc2が先に来てしまうと言うことです。
>>233 了解しました。そういえばネストって書いてありましたね。(恥
実行順序は正しくても人間の思考の流れと記述が逆転するので
プログラムしづらいと‥‥‥。
では………
_{ c true = } _{ ." true" } { ." false" } :if
という構文にすれば、
_{ age 30 < }
{
_{ age 16 < } _{ ." タイーホ" } _{ ." ウマー" ) :if
} _{ ." マズー" } :if
となって条件の判定の順序が人間の思考と近いかもしれないですね。
_{ c true = } _{ ." true" } :ifTrue
_{ c true = } _{ ." false" } :ifFalse
という構文もあるとイイかもしれません。
制御構文はそもそも手続きに対するメッセージだと言う感じもしますし。
235 :
202の名無し:02/03/15 20:11
_{ c true = } _{ ." true" } _{ ." false" } :if
という構文では、:ifメッセージのレシーバは_{ ." false" }ですか。
それとも:ifメッセージは常にスタックの
二つ奥に送られると言うことでしょうか。
>>235 _{ ." false" } がメッセージを受け取ればいいと思うんですけど。
どんなものでしょう?
ところで、GikoForthへ手続きブロックの実装をやってみました。
下のIF文は同じ構文になるようにしただけの似非実装でOOではないです。
(そもそもGikoForthにはまだオブジェクト以外の標準クラスがないので。)
道具が揃ったらオブジェクトでラップしようと思いまふ。
バイナリとソースは今晩うぷします。たぶん。
☆ アルファベットでの表記の例
: test { age | func -- }
:[ bl emit age . cr ]; -> func
age 30 <
:[ age 16 <
:[ ." タイーホ" func call ];
:[ ." ウマー" func call ]; :if
];
:[ ." マズー" func call ]; :if
;
☆ 日本語風表記での例
単語 検査 { 年齢 | 年齢表示 -- } を
【空白を一文字表示し年齢を数値表示し改行する】→年齢表示
年齢が30より小さいとき
【年齢が16より小さいとき
【"タイーホ"を表示し年齢表示を呼び出す】を
そうでないとき
【"ウマー"を表示し年齢表示を呼び出す】を
を選んで実行
】
そうでないとき
【"マズー"を表示し年齢表示を呼び出す】を
を選んで実行
と定義
238 :
デフォルトの名無しさん:02/03/16 05:40
: age { age -- } ;
>>236 このばあい_{ ." false" }では
どのようなメソッドを実行したらよいのでしょうか。
Smalltalkではtrue(false)クラスではtrue(false)の場合の手続きだけを実行する
と言う風にしていますが、上手いメソッドが思い付きません。
Trueクラス、Falseクラスに
oProc oBool :ifTrue
oProc oBool :ifFalse
というメソッドが既に存在していれば、
:m :if ( oBool oProcT -- )
self -rot over
:ifTrue
:ifFalse
;m
こんな感じで良いのではないでしょうか?
-rot ( a b c -- c a b )
over ( a b -- a b a )
というスタック操作ワードを使用していますが。
えせMops表記で分りにくかったらごめんなさいです‥‥。
242 :
デフォルトの名無しさん:02/03/19 01:30
>>240 Forthの構文ってきれいだね。
おもしろそうだな。
243 :
デフォルトの名無しさん:02/03/20 17:20
>>240 over :ifTrue
self swap :ifFalse
でもいい?
>>243 あう。そのほうがシンプルですねぇ。
-rotなんていうマニアックな命令をつかわなくて良いし‥‥。
恥ずいのでsage
245 :
202の名無し:02/03/22 01:26
裏で手続きが前にくる構文を使っているのですね。
これなら表でこの構文を使う方が好みです。
>>245 あくまでもオブジェクトにこだわった実装の場合のシンタックスシュガー
ってことで。てへへ。
自分がやるときはFORTHのプリミティブ使って手続きクラスに直接実装しちゃうと思います。
下げたまんまだった‥‥。
いちおうあげときます。
248 :
デフォルトの名無しさん:02/03/22 09:53
わけわからん。
説明されても、やっぱりわけわからん。
おれには一生理解できないのか。
>>248 わかりにくくてスンマソン。(T-T)
ローカル変数を使って、
:m :if { oBool oProcT -- }
oProcT oBool :ifTrue
self oBool :ifFalse
;m
でもよかったんだけどそれじゃ身も蓋もないと思ったので‥‥。
スタック操作は確かにわかりにくいと思います。自分も書くときはすぐに
ローカル変数を使って楽をします。
話は変わりますが、ブロックが前にくるタイプのif文のオブジェクトの
スタック上の順番をどうするのが良いか、もう少しいろいろと議論した方が
良いのかもしれませんね。
↓GikoForthですけども………、
http://www.geocities.co.jp/SiliconValley-SanJose/4733/ ブロックを使った例外処理とローカル変数を含む四則演算の中置記法の処理を
実装しまひた。
:[ 2 throw> ]; >catch
とか
i[ A^2+2*A+1 ] -> B
とか書けます。
あと地味な拡張として、アルファベット表記の動的束縛はこれまでは
anObject message: []
と書いていましたが、日本語表記との対応を考えて、
anObject ::message
とも書けるようにしまひた。
今度はかなり長く放置することになると思います。
‥‥‥‥寝る。
251 :
デフォルトの名無しさん:02/03/25 01:37
は〜〜〜〜〜〜〜〜ぁぁっ、
あげ。
空揚げ
>>252 いつもメンテしてくれてありがとん。
GikoForth :
http://www.geocities.co.jp/SiliconValley-SanJose/4733/ なんだかんだでやっぱり気になるので、また手を付けてしまいました‥‥。
オブジェクト拡張を
>>82のclassM10ベースに移行しました。
というわけで多重継承可になりました。
動的束縛しまくるGikoForthの場合、多重継承ベースのクラス構成だと、
遅くてたまらんとオモタのでスーパークラスを持てずインスタンス化
できないmix-inモジュールを定義できるようにしまひた。
非分かち書き拡張部にでっかいバグがあったので潰しました。
そのためすこし構文が変更になりました。
あー今度こそヤメルぞ‥‥‥。
☆ モナーとじゃんけんゲーム
★ クラスの定義
クラス「じゃんけんモナー」は<オブジェクト>を継承し
☆ メソッドの定義
『手: ( -- 手 ) とは
3までの乱数に1を足す』
『表示: { 手 -- } とは
手が1と等しいならば"ぐー"を表示つぎに
手が2と等しいならば"ちょき"を表示つぎに
手が3と等しいならば"ぱー"を表示つぎに』
『じゃんけん: { | 相手の手 モナーの手 -- } とは
ここから
"なにをだすモナ? 1:ぐー 2:ちょき 3:ぱー それ以外:やめる"を表示し改行
数値入力→相手の手
自分の手。→モナーの手
相手の手が0以下相手の手が4以上のどちらかならば逝ってよし
つぎに
"あなたの手:"を表示し相手の手を自分で表示。改行
"モナーの手:"を表示しモナーの手を自分で表示。改行
モナーの手と相手の手が等しいならば
"引き分けモナ"を表示し改行
さもなければ
モナーの手から相手の手を引き1と等しい
モナーの手から相手の手を引き-2と等しい
のどちらかならば
"あなたが勝ったモナ"を表示し改行
さもなければ
"モナーが勝ったモナ"を表示し改行
つぎに
つぎに
を再び繰り返し』
を実装する
★ 「じゃんけんモナー」クラスのインスタンス「モナー」の生成
じゃんけんモナー「モナー」
☆ 「モナー」インスタンスの「じゃんけん」メソッドを起動
モナーとじゃんけん。
深度280。sageヨシ。
「メンテ」
深度406より浮上。
>>256 ムーアたん‥‥(;´Д`)ハァハァ
GikoForth :
http://www.geocities.co.jp/SiliconValley-SanJose/4733/ 更新しますた。
Objective-CのCategoryぽいものを実装。
インスタンス変数は追加できないところがCategory風(?)。
(ところでアスペクト指向ってなんすか?)
JTerminalを使用するにはデヴェツールでビルドが必要なことに
いまさら気が付いてFinderから起動することのできるGikoForthX
アプリケーションをでっちあげますた。
これでようやく本当にデヴェツール持ってなくてもお試しできます。
いま一つ気になることが‥‥‥。
ライセンスってどうするべきなんでせう??
pForthはパブリックドメイン。
classM10とBNFパーサーはライセンス不明。
たぶんパブリックドメインのような気がします。
(Forthコミュニティの伝統??嘘かも。でもMopsもPDSだし。)
GikoForthはGPLにすべきなんだろうか?
パブリックドメインでもいいのかな?
迷ってます。
あとターミナル版GikoForthは他のUNIX系OSでもコンパイルし直すだけで
そのまま動作するような気がします。
‥‥‥‥‥makeファイルってなんすか?(T-T)
>>258 >ライセンスってどうするべきなんでせう??
全部自分で作れば即解決。ガンバ!
>迷ってます。
全部自分で作れば即解決。ガンバ!
>‥‥‥‥‥makeファイルってなんすか?(T-T)
ググールで【マケファイル】って検索したらでてきます。
261 :
デフォルトの名無しさん:02/05/06 23:24
262 :
デフォルトの名無しさん:02/05/07 01:16
>>261 ダウソロードしたよ。
これでMac OS Xでも……(;´Д`)ハァハァ
とオモータんだけどEnterキーがきかねぇ。(怒
思わずcomp.lang.forth.macを覗いてみたら、
ウインドウをリサイズしてから他のアプリケーションを
フロントに持ってきて、も一度Mopsのウインドウを手前に
持ってくれば使える、とあった。(何のまじないだ?)
……ををコンパイルできる……けどInstallできねぇ(涙
スタンドアロンアプリを生成できないんですけど。
(これは何かの罰ですか?)
も少し待ちかなぁ……。
263 :
デフォルトの名無しさん:02/05/07 23:15
>>262 おおすごい。
うちもEnterきかなくて目が点でした。
これからやってみます。
264 :
デフォルトの名無しさん:02/05/08 00:15
Mops 5.01
アプリで表示させる日本語のタイトルやラベルが化けるんですが何か良い方法が
あるんでしょうか。
mops age
265 :
デフォルトの名無しさん:02/05/08 00:21
comp.lang.forth.macにMops作者のMikeタンのシリアスな書き込みが…
http://groups.google.co.jp/groups?dq=&hl=ja&group=comp.lang.forth.mac&selm=newscache%24wmxpvg%24wsm%241%4 > The tough reality is that for Mops to continue, it really does need more effort than I can manage alone.
> The IDE is showing its age -- in particular it now needs an OSX-native text editor.
> Also the Manual is way out of date, and needs a major revision.
> I'll do it if people need it, but otherwise I'd rather not bother.
> I've got other things I could be doing.
こんなこというてはります。
> But I'd really like to know now whether there are still a significant
> number of users who aren't in a position to contribute,
> for whatever reason, or whether there just aren't very many users any more.
とも言ってるんで、Mopsの開発継続して欲しい連中はMikeタンに
フィードバックしてくだちい。
今すぐに!
>>264 ほんとだ。文字化けする‥‥。
対策は………ワカンナイ、ゴメソ。
267 :
デフォルトの名無しさん:02/05/08 02:31
>>265 とりあえずMikeタンにおてまみ出しときますた。
268 :
デフォルトの名無しさん:02/05/11 00:26
以前Mopsを試したことがあるのですが、敷居が相当高い気がしました。
1.日本語のMops情報が限りなくゼロ
2.そもそもForth自体が超マイナー
3.本屋で日本語のForth本は手に入らない、今後も出る予定があるとは思えない。
4.結局ToolBoxの知識は必要になる。
5.したがってC言語の知識も必要になる。
6.日本語がインライン入力できない。解決するには結局ToolBoxどっぷりになる。
というつらい目にあうことになります。
最低限以下のようなページがないとつらい。
http://www.big.or.jp/~crane/cocoa/indexOnline.shtml 「Mopsはやっぱり!」
をだれかお願いします。(汗)
269 :
デフォルトの名無しさん:02/05/11 07:16
Mopsを使ってる人間が言うのもアレなのですが、正直、
Mopsはあまり初心者向きではないんですよね……。
MPWがフリーになる前は、無料でToolBoxを駆使できる唯一の
開発環境だったのですが、MPWもフリーになり、デベツールが
OS Xに付属している現在ではあまりアドバンテージがない……。
しかも付属のライブラリにバグがあったりしてそれを回避したり
直したりしながらプログラムすることになります。(涙
……じゃあいったい誰が使っているのか?といえばモノ好きなオレとか……。
……オレとか……オレとか……。
…………。
…………。
ところでMopsの英文マニュアルは、内容が古くなってはいますが、
Forth&OOP入門の書としてイイです。
……………英語ですけど…………。
270 :
デフォルトの名無しさん:02/05/16 17:23
openfirmware勉強CHU!
保守
スレッド 安芸る
274 :
デフォルトの名無しさん:02/05/26 23:37
どうなってんだ?
>>275 ちゃんとあがってるよ。
更新されてないだけでしょ。
更新しますた。。。
‥‥いやネタじゃなく。ついでに移転しました。
GikoForth :
http://gikoforth.s13.xrea.com/ 実はxreaがめずらしく一般サイトの募集をやっていたので出来心でスペース
とっちまいました。
更新内容ですが、文字列と手続きブロックをオブジェクトでラップしてみました。
"逝ってよし" とか 【2を掛けて1を足す】とかは
それぞれ「文字列」「ブロック」クラスのオブジェクトをスタックに返します。
肝心のクラスライブラリの中身はスカスカに貧相ですが、カテゴリを使って
クラスを派生することなくメソッドを追加したり置き換えたりできるので、
とりあえずこの段階で公開しときます。
Cocoaネイティブ版を作りかけましたが、ヘタレなんで何年かかるかワカランです。
ちょとやる気が萎えますた。
ちなみに「ブロック」クラスの中のifメソッド関係の定義を抜き出してみました。
:m ifTrue: ( b -- ) IF call: self THEN ;m
:m ifFalse: ( b -- ) not IF call: self THEN ;m
:m if: ( b ^blObj -- ) swap IF call: blockvec ELSE drop call: self THEN ;m
したがってブロックを使ったIF文モドキは今のところ以下のようになってます。
b true = :[ "True" ::print ]: :[ "False" ::print ]: ::if
trueやfalseがオブジェクトじゃないので、この順番でしか書けないんですよね。
XREAはもうs13までいってるのか。
ワシんとこはs8です。3ヶ月ぐらい前かな。
早ぇ。
>>279 ムアーたんのサイトってどんなんだろ? (;´Д`)ハァハァ
再起下降でゴリゴリ書いた変な処理系とか
躁病患者を一気に鬱病患者にするほどのネガティブ天体観測日記等です。
もちろんデフォルトで電波を通常のサイトの3倍(赤)飛ばしています。
天文台から。ムアー(´∀`)
>281
ネタに聞こえないところがアレですなぁ…
F#出たね。
Forthじゃないけど。
286 :
デフォルトの名無しさん:02/06/10 18:09
287 :
デフォルトの名無しさん:02/06/11 16:46
してみる。
ところで他の言語ではキーワードを行のはじめに置いて字下げをしますが、
FORTHではキーワードを行の終わりに置いて字上げ(地上げじゃありませんよ)をするのがいいと思うのですがどうでしょう。
_____________(conditoin1) IF
______(conditoin2) IF
(procedure1.1) ELSE
(procedure1.2) THEN ELSE
______(conditoin3) IF
(procedure2.1) ELSE
(procedure2.2) THEN THEN
_________________BIGIN
(condition) WHILE
_(procedure) LOOP
IF文が何重にもネストした場合THENがいくつも並ぶことがありますが、
これが一行に詰め込めます。
>>290 THENやELSEは書いているみたいなので段差でブロックをあらわしてるわけでは
ないと思うが‥‥‥
>>289 202さん、おひさしぶりす。
これはキーワードが右側に並ぶのがミソつうことですか‥‥?
ああん、だめ、脳がついてけないです。
(;´Д`)
293 :
デフォルトの名無しさん:02/06/30 00:13
わっしょい
古本屋で買っちゃったよ。
「パソコンユーザーのためのForth入門」age
296 :
デフォルトの名無しさん:02/07/10 11:55
Forth インタプリタをもった、 ブートローダ 作りたいんだけど、 ここでよろしいですか?
>>296 ブートローダはわかんないけど、Forthの話題ならここで可かと。
298 :
デフォルトの名無しさん:02/07/13 21:36
ANS FORTHの規格の日本語訳と言うのは存在するんでしょうか?
訳してみようと思っているんですが、もしもう存在するなら無駄なこと
はしたくないので。
ご教示おながいします。
300 :
デフォルトの名無しさん:02/07/13 23:03
さげちゃった。
揚げ。
301 :
デフォルトの名無しさん:02/07/14 00:44
漏れ、今ほそぼそとDPANS94翻訳中
303 :
◆dPyZXuuM :02/07/14 23:34
>>302 Wikiかなり充実してま砂。
このスレの閲覧者、意外に多いのか。
勝手に作った(´∀`*)
ありがとん。玉しゃぶろうタン‥‥‥‥。
DPANS2.htmアップップ。
で、DPANS3.htm翻訳中。
ページ数少ないし、分担したらサクサクっと終わるような気がするんだけど、
どうよ。
310 :
デフォルトの名無しさん:02/07/16 23:02
えらい深いところに。
1. Introductionをほぼ訳し終わりました。
今、A. RationalのA.1 Introductionにかかっています。
素人さんなのであまり難しいところは訳せませんがぼちぼちやっていきます。
ン
メ テ
ナ ン
ス
ほしゅ
315 :
デフォルトの名無しさん:02/08/15 23:25
ほしゅ
ら
ぞ
ほ
し
317 :
デフォルトの名無しさん:02/09/10 15:12
ColorForth使ったことある人いる?
318 :
デフォルトの名無しさん:02/09/11 21:12
Forth がブートローダに良く使われている理由はどういった事からですか?
処理系が小さいからかな?
320 :
デフォルトの名無しさん:02/09/26 02:02
そのたうり
321 :
デフォルトの名無しさん:02/10/16 09:10
Forthって一度ワードを定義したら、削除する場合、
それ以後に定義したワードを全部削除しなきゃいけないんですよね?
拡張してくうちに収拾付かなくなりそうな気がするんですけど。
以後が変
>>321 拡張するだけなら単に同名ワードを再定義しる。
過去に定義したワード自体の定義を変更したい場合には、辞書を再構築する方がよろし。
じゃあなぜ削除が存在するかと言えば、ファイルから定義を読み込み、実行し、処理が
終わったらそのワード定義以降のメモリを解放する、といった用途のためだと思われ。
324 :
デフォルトの名無しさん:02/10/22 11:07
321じゃないけど納得。
ANSのドラフトだとforgetは非推奨になってるね。メモリ管理用の
word setが出来たから必要なくなったってことかな。
325 :
デフォルトの名無しさん:02/10/22 11:26
マイナー言語だからこそ
愛着をもてるんだが、
意味ないよな。
JAVAでやった方が全然効率がいいのに
なぜか使ってしまう。
326 :
名無しさん@Emacs:02/10/24 21:22
Mops スレで聞くのも何ですが、皆さんは普段どんな Forth 処理系を使ってらっしゃいます?
か?
答えが返ってこないということは結構「俺Forth」が多いのかな?
ムーアタンも「俺Forth」作るの推奨しているし(w
今すぐL1-AしてOpenBootだ!
うぐ‥‥‥。しばらくみてなかったよ。
>>326 当方マカーなのでMac OS9で役に立つものを作る場合はMops使ってました。
Mac OS Xになってから昔のコードに不具合が出てきてちょっと疎遠になってます。
DというMac OS XでPowerPC Nativeコードを吐けるForthも持っていますが、ほとんど使っていません。
使った事はないけど、良さげな他プラットフォーム向けForth処理系で知っているのは、
GForth
bigForth
win32Forth
かな?
>>328 それもまた良し。
最近、興味を持ったので age ます。
ちなみに、モバイル板から来ますた。
332 :
デフォルトの名無しさん:02/11/04 04:06
age 忘れた・・・
333 :
デフォルトの名無しさん:02/11/07 23:01
>>333 ナイスな情報サンクス!!早速ゲットだ!
…って、Palmデバイス一つも持ってません(w
ほす
あぼーん
↑ムーアタソの悪口を書いたのか?(w
Forth インタプリタをもった、 ブートローダ 作りたいんだけど、 ここでよろしいですか?
ほ
し
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\
Λ_Λ | 君さぁ こんなスレッド立てるから |
( ´∀`)< 厨房って言われちゃうんだよ |
( ΛΛ つ >―――――――――――――――――――‐<
( ゚Д゚) < おまえのことを必要としてる奴なんて |
/つつ | いないんだからさっさと回線切って首吊れ |
\____________________/
(-_-) ハヤクシンデネ… (-_-) ハヤクシンデネ… (-_-) ハヤクシンデネ…
(∩∩) (∩∩) (∩∩)
(-_-) ハヤクシンデネ… (-_-) ハヤクシンデネ… (-_-) ハヤクシンデネ…
(∩∩) (∩∩) (∩∩)
(-_-) ハヤクシンデネ… (-_-) ハヤクシンデネ… (-_-) ハヤクシンデネ…
(∩∩) (∩∩) (∩∩)
なんでも俺を実験に使うそうで
自由に発言してもいいが
その発言で問題が起きたら
自分で責任をとれって事。
そんな当たり前の事もできないんだ。
年収はいくらですか?
たかゆきってあんなにレスする香具師だっけ?
キャップ漏れだったりして
348 :
デフォルトの名無しさん:03/01/09 14:46
記念的カキコ
======2==C==H======================================================
2ちゃんねるのお勧めな話題と
ネットでの面白い出来事を配送したいと思ってます。。。
===============================読者数: 138720人 発行日:2003/1/9
年末年始ボケがそろそろ収まり始めた今日このごろのひろゆきです。
そんなわけで、年末に予告したIP記録ですが実験を開始しています。
「2ちゃんねる20030107」
こんな感じで各掲示板の最下部に日付が入ってるんですが、
20030107以降になってるところはログ記録実験中ですー。
んじゃ!
────────────────────────Age2ch─
■この書き込みは、Age2chを使って配信されています。
────────────────────────────
Keep your thread alive !
http://pc3.2ch.net/test/read.cgi/software/1041952901/l50 ────────────────────────────
>>754 まともじゃない掲示板なんて存在意義ないね。
そういうことならここじゃ意味ないと思うが。
ワン切りしてみた!!
歌広で童貞捨てたのか、、
「書き込んだ人(恨みをもつ客?)」 VS 「病院」
のイザコザに巻き込まれた(利用された)、掲示板管理人ひろゆき氏。
だべ?
なんで加点のか不思議。
>>197 実家からはネット環境ないからできんよ、漫画喫茶からでないと。(w
...というわけで
[出せ]といわれて出すかどうか。
[見せろ]といわれて見せるかどうか。
[あるだろ]といわれてハイと言うかどうか。
そんだけのことのよーな気がする。
356 :
デフォルトの名無しさん:03/01/10 12:30
お前ら、勝手にスレを使わないでくれ。
ここは、人は少ないがForth言語についてのスレだ。
迷惑だから出ていけ。
正しい情報なら中傷誹謗もOKなんじゃない?
悪食だから大丈夫かもとかいってみる。
大阪キタ━━━━━━(゚∀゚)━━━━━━ !!!!!
>>312 キタ━━━━━(゚∀゚)━━━━━!!!!
マソコ
昔+にもいたぞ。
バカ丸出しだなw
00:00〜03:00
とか適当に書いておこう。
それでも私は /usr/bin/dc を使うのです。スタック万歳!!
総会屋さん、こんばんは。
ひろゆきがこないと盛り上がらないね
======2==C==H======================================================
2ちゃんねるのお勧めな話題と
ネットでの面白い出来事を配送したいと思ってます。。。
===============================読者数: 139038人 発行日:2003/1/10
なにやら、連日メルマガだしてるひろゆきです。
そんなわけで、ログ記録実験ですが、いちいちサーバ指定するのが面倒なので、
全部のサーバに入れてみました。
重くなって落ちたりしてもご愛嬌ってことで。。。
んじゃ!
────────────────────────Age2ch─
■この書き込みは、Age2chを使って配信されています。
────────────────────────────
Keep your thread alive !
http://pc3.2ch.net/test/read.cgi/software/1041952901/l50 ────────────────────────────
249 名前:ひろゆき ◆3SHRUNYAXA [] 投稿日:03/01/08 17:52 ID:rLfxQ17l
>荒らしとか犯罪のためなの?
そす。
246 名前:心得をよく読みましょう[] 投稿日:03/01/08 17:52 ID:BH998yxV
>ひろゆき
俺のお気に入りのスレとか荒されてるんだがそういうのにも有効?
257 名前:ひろゆき ◆3SHRUNYAXA [] 投稿日:03/01/08 17:53 ID:rLfxQ17l
いずれは。
301 名前:心得をよく読みましょう[] 投稿日:03/01/08 17:57 ID:zbarv++q
>ひろゆき
2ch閉鎖って考えたことある?
310 名前:ひろゆき ◆3SHRUNYAXA [] 投稿日:03/01/08 17:58 ID:rLfxQ17l
ラウンジが重いですとかいちいち電話してくる人がいたとき。
おもしろくないよ。
( ´ァョ)ノ< ワラタ♪
はどこで叩かれた有名人さんだろう?
隊長!誤爆しましたっ!
すまん!
あはは(^_^;)ま、大丈夫かどうか聞いてから書くくらいなら
書かなくていいわな。
GAっていつのまに2ちゃんねるアニメランキング1位になったんだ?(w
止んだ?
テレビで放送されると厨が大発生するから嫌になる
正月早々2ちゃんねる(プ
>>357-379 ここはFORTHスレッドだ。人はごく少ないが生きている。
雑談は他所でやってくれ。
>>380 ここ数日間、この板全体がコピペ爆撃に晒されておるのじゃよ。
コピペに向かって叫んでも、それは詮なきこと。悲しいのう。
自治スレで何やら対策を協議しているようじゃが、何時になった
らこの惨劇が終わることやら。
382 :
デフォルトの名無しさん:03/01/12 14:50
>>381 ム板はこのスレしか見てないので気がつきませんでした。
とはいえ、これだけレスの少ない板だと本来のレスが埋もれて見にくいので
レスの削除依頼をかけようと思うのですがどうでしょう?
あ、あげてしもた。。。
裁判で負けたら、手のひらを返したようにルール変更
匿名は弱者保護のためですって言ってのは、やっぱり詭弁だったんだね (´・д・`)
ISP責任法でよろしこ
厨質問スマソ
hobby 今何をされてるんでつか?
(^^)
4 名前:心得をよく読みましょう 投稿日:02/12/30 12:30 ID:yzKcjLnM
4ndってネタ?4thじゃないの?
(^^)
(^^)