5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

: Mops ( オブジェクト指向FORTH -- ) ;

1 : 1:01/09/10 19:41
ニッチ(Mac)の中のニッチ(FORTH)。
オブジェクト指向FORTH言語、Mopsについて語るスレ。
いや、語れるのか‥‥?

2 :1:01/09/10 19:56
参考URL
http://www.netaxs.com/~jayfar/mops.html

3 :デフォルトの名無しさん:01/09/10 20:32
そういや Mops 落としたことあるけど、全く使ってないな。
つか、中身も全然みてない。

FORTH がどうやったらオブジェクト指向になるんだろう。
確かに 1 2 + . がメッセージパッシングとして見えなくは
ないけど。クラスの定義とか継承とかできるんだっけ。

よかったら解説きぼん。

4 :1:01/09/10 21:43
>3
オブジェクトにメッセージを投げるのは、

 someMessage: anObject

のよーにする。最後に『:』のつくワードはメッセージと解釈される。
パラメタが必要な時には someMessage: の前にスタックに積んでおくぞ。FORTHだからね。
最後に『:』のつくワードはコンパイル時に、直後に置かれたオブジェクトを調べて
メソッドの結合を済ませてしまう。静的束縛なわけだ。

動的束縛にしたい時は、

 someMessage: [ anObject ]

という具合にオブジェクトをカギカッコでくくっておく。するとメソッドの結合は、
実行時まで遅延される。C++と違って呼び出し側が選ぶわけね。
(メソッドディスパッチのためのテーブルを常に辞書に抱えてるのね〜。メモリ食いかも〜。)

5 :1:01/09/10 21:51
4の続き。

FORTHであるが故に、メッセージ: オブジェクト の順序になるのだが、結果として、

print: GIKO

のごとく英語の語順としては自然になるため思ったより読みやすい。
(逆に「日本語でワードを登録したらMINDみたい!」、ってわけには逝かなくて残念無念。)

6 :1:01/09/10 22:03
クラス定義は

: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するっていう形ならば。

でもそれだと、メソッドの静的結合は、困難になるかな。
まあ動的オンリーでいいじゃんという気もするが。

8 :1:01/09/10 22:21
>7
ややっ。もしかしたら静的束縛も可能かも。
メッセージ側に静的束縛を示す修飾子みたいなのを用意して、
オブジェクトのコンパイル時に直後のメッセージが修飾子付きなら
メソッド結合を済ませたコードを生成すればいいのかも。
修飾子なしならオブジェクトのselfをスタックトップに積む。
いかが?

9 :2:01/09/10 22:37
解説どうもありがと。>>8

私も >>7 と同じで、レシーバを後に書くのは逆に FORTH的じゃないような
気がしたんだけど、message を先にスタックに積んでおいて後でオブジェクトを
作用させることで挙動がポリモーフィックになるとすれば、納得できるような
気もする。

ところでメッセージを実行した後のスタックの状態はどうなるの?
そのメッセージを受けたオブジェクトがスタックに残るわけかな。
スタックトップにあるオブジェクトにメッセージを送ることはできるの?

10 :1:01/09/10 22:58
>9
メッセージを実行した後には、呼び出されたメソッドが残したスタックの状態以外なにも
残らないです。分かりやすいのですが、メッセージを連続的にオブジェクトに流し込むSmalltalk的な
使い方ができない原因でもあります。
スタックトップにあるオブジェクトにメッセージを送る場合は、

anObject someMessage: []

という構文が使えます。スタックトップのオブジェクトの解釈は実行時までわからないハズなので、
動的束縛による呼び出しになりますが、そのオブジェクトの属するクラスをコンパイル時に指定
してイイ場合には、

anObject someMessage: class_as> someClass

という呼び出し方をすることで、実行時のオーバーヘッドを小さくする事が出来ます。

11 :デフォルトの名無しさん:01/09/10 23:36
forthでOOPしたいんか?

12 :デフォルトの名無しさん:01/09/10 23:40
>11
したいっていうか、もうやっちゃってる人がいる。(w

13 :2:01/09/11 00:18
>>10
あそうか。メソッドの結果をスタックに残す場合、デフォルトで
レシーバもスタックに残っちゃうとかえって扱いにくいだろうな。

> anObject someMessage: []

なるほど。てことは、メソッドの中で復帰値として自分自身を明示的に
スタックに積んで終了すれば、同じオブジェクトに連続的にメソッドを
作用させることもできるわけだよね。

> anObject someMessage: class_as> someClass
> という呼び出し方をすることで、実行時のオーバーヘッドを小さくする事が出来ます。

メソッド呼び出しの束縛の仕方を動的にするか静的にするかを C++ の
ように定義側ではなく、呼び出す所で選択できるのはなかなかよい
ですねぇ。結構イケてる言語なのかも。

14 :1:01/09/11 00:36
>13
> なるほど。てことは、メソッドの中で復帰値として自分自身を明示的に
> スタックに積んで終了すれば、同じオブジェクトに連続的にメソッドを
> 作用させることもできるわけだよね。

なるほど、そういうやり方もありますね。

> 定義側ではなく、呼び出す所で選択できるのはなかなかよい
> ですねぇ。結構イケてる言語なのかも。

面白い言語だと僕は思うんですけど、あまりにマイナーなもので‥‥。
呼び出し側が束縛の仕方を選べる言語って他にあるのかな?
私は詳しくないんですが。

15 :2:01/09/11 07:04
>>14
> 呼び出し側が束縛の仕方を選べる言語って他にあるのかな?

あまり聞いたことないすね。そもそも動的なのが普通だから。
C++ みたく実行効率重視の言語だけが両方持ってるんじゃないかな。

> 面白い言語だと僕は思うんですけど、あまりにマイナーなもので‥‥。

やっと思い出したんだけど、Mops 落としたのに結局使わなかったのは、私が
Mac 持ってなかったからでした(大藁

で、Mac以外でも使えないかと捜してみたら

http://www.asahi-net.or.jp/~uw4s-wtnb/chidori-mops.html
このページにある FAQ に「Win32Forth が Mops のオブジェクトモデルを
取り入れている」とあって、下から落とせるみたいね。

http://www.taygeta.com/forthcomp.html

16 :デフォルトの名無しさん:01/09/11 07:09
MOPSって、CLOSのMOP(meta object protocol)の
ことじゃないですよね・・?

17 :2:01/09/11 09:10
Mops も CLOS も詳しくないのでアレだけど
>>16
Mops は
Michael's Object-oriented Programming System

とのことなので MOP とは関係ないみたい。
とは言え、Mops のベース言語である FORTH 自体が自己拡張性を
持った言語なので Mops でもその辺の機能がある程度使える、
…かもしれません。

18 :1:01/09/11 12:02
>>15
> C++ みたく実行効率重視の言語だけが両方持ってるんじゃないかな。

一般的なオブジェクト指向言語から見るとC++のほうが特殊というわけですね。

> このページにある FAQ に「Win32Forth が Mops のオブジェクトモデルを
> 取り入れている」とあって、下から落とせるみたいね。

そんなものがあったんですね。気がつきませんでした。
我々は孤独ではなかった!(藁
アセンブラでかかれているMopsのコア以外の部分はFORTH自身で記述されてい
るので、やろうと思えば別のFORTH処理系にも持っていけるのかも。

>>17
> Michael's Object-oriented Programming System

Michael Horeっていうオーストラリアのおぢいさん(孫がいるらしい)が一人で
開発しているらしいデス‥‥。

19 :デフォルトの名無しさん:01/09/14 02:55
forthって中間言語以外の用途ってあるんでしょうか

20 :デフォルトの名無しさん:01/09/16 21:16
Forthを中間言語に使っているシステムってどれ?

21 :元潜水艦乗り:01/10/04 20:14
保守カキコ。深度285/376。sageヨシ。
>>19-20
中間言語ってのとは少し違うがSunのOpenBootとかAppleのOpenFirmware
とかはFORTHみたい。
JavaのVMはスタックマシンみたいだけどスタックマシンならFORTHか?と
言われると少し違うような気がする。
っていうかたいていのコンパイラはスタックマシン向けのコードを生成して
からレジスタ割付けなんかをやって最適化したネイティブコードを作ってる
のでないかな?でもそれをFORTHとはよばないやうな。
あんまり知らんけど。

22 :元潜水艦乗り:01/10/13 09:29
保守カキコ。深度189/378。sageヨシ。
ぢつは、日本語化をあれから少しだけやってみた。
クラス定義だけできるようになった。


「 モナークラス 」は「 オブジェクト 」を継承し、
『 セリフ: " オマエモナ〜" 』
を実装する。

メソッドを呼び出す構文で良いのが思い付かず、途中やめにしてる。

へたれです………。

23 :デフォルトの名無しさん:01/10/20 17:51
    ∧ ∧  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 〜' ― (,,゚Д゚) < 深度248/402。sage!!
  し― し-J  \___________

24 :デフォルトの名無しさん:01/10/23 00:34
爆雷投下

25 :デフォルトの名無しさん:01/10/23 01:19
たどり着いたらいつも雨降り

26 :第4番目の名無しさん:01/10/23 18:06
OpenFirmwareから書き込んでいますうそ
FORTHの考え方は好きだなぁ。
フェチ逝って良しですか?

27 :デフォルトの名無しさん:01/10/23 18:18
スタックトップのオブジェクトをレシーバーとする方がきれいだと
思うがなあ。anObject message とか。

数値も文字列もオブジェクト。+や.もメッセージと考えればすべて
うまくいくような。あ、引数なしのメッセージが困るか?

28 :25:01/10/23 18:28
>27
そういうのも蟻だと思う。
ANS仕様のForthならインタプリタやコンパイラいじり放題だから俺流アプローチのOOPが可能だよね。
俺は挫折したけど。

29 :22:01/10/23 18:54
>>27
たしかに、

anObject message

の形だと日本語の文脈にも合うので美しいなぁ。
‥‥‥‥コンパイラの中枢部分まで降りていって書き換えるか。

>>28
Forthはいじり放題、てのには激しく同意。
制御構造だろうがなんだろうが俺流につくれてしまう
Forthマンセー。
なんだけどおかげで方言だらけ(涙)。
Mopsも完全にはANSI互換じゃないしなぁ‥‥。

30 :デフォルトの名無しさん:01/10/23 18:57
>>26
名前がとても良いです。
このスレのデフォルトにしたいぐらいに。

31 :デフォルトの名無しさん:01/10/23 19:23
メタコンパイルage

32 :第4番目の名無しさん:01/10/23 20:45
>>30
サンクス。

33 :22:01/10/23 21:12
Mopsではmessageには

print:

のように最後に:を付けて区別しているので、
日本語化する時には、

印刷する。

みたいに最後に。が付いたモノは オブジェクトに
対するメッセージと言う事にすればヨイかな、
と思ったのですが、引数はどこに置くのがいいんでしょうね。

1)
anObject p1 p2 p3 message

2)
p1 p2 p3 anObject message

1)は引数とanObjectを区別するために少し細工が必要か。
(ブロック構文みたいになるかな?)
2)はmessageを直前にスタックに積まれたオブジェクト
に投げればイイだけなので実装は楽かと。
でも日本語化した時に楽しいのは1)のほうかな?

家政婦 は、

 (‥‥この間100行。)

見た。

あ、助詞をうまく使えば両方の構文を実装できるやうな
気もしてきた‥‥‥。

34 :デフォルトの名無しさん:01/10/23 23:42
たった一つだけ スタック制御だけ

なんでもないですage

35 :デフォルトの名無しさん:01/10/26 00:42
>助詞をうまく使えば

それはForthよりもSmalltalkに近い、という説が。
tp://isweb21.infoseek.co.jp/computer/h_yanai/html/B8E5C3D6A5ADA1BCA5EFA1BCA5C9A5E1A5C3A5BBA1BCA5B8.html

36 :22:01/10/26 02:14
リンク先を読みました。
似たような(たのしそうな)議論をしてますね。(^^
1)の構文のように複文かましてオブジェクトに流し込むという感覚は、
Smalltalkぽいわけですね。むー。
「スタックから何個オブジェクトもらうかはウチで決めさせてもらいますわ。」
の2)の構文のほうが確かにForthらしいか。
助詞によるパラメタのコントロールは魅力的だけど、スタック操作の実装を考えると、
オレみたいなへたれには荷が重いかも‥‥。
のんびり考えてみます‥‥。

37 :デフォルトの名無しさん:01/10/26 18:30
salvage

38 :デフォルトの名無しさん:01/10/26 21:30
    ∧ ∧  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 〜' ― (,,゚Д゚) < Forthのプロジェクト成功率は30%!!
  し― し-J  \___________

ttp://www.gyve.org/~jet/lang2.txt

‥‥微妙に中途半端だな。

39 :デフォルトの名無しさん:01/11/20 11:38
312 PICK

40 :デフォルトの名無しさん:01/11/20 11:42
DROP

41 :22:01/11/20 12:47
モプースの日本語化がわずかばかり進みましたのでご報告。
anObject someMessage 型のメソッド呼び出しが出来るようになりました。
↓現在こんな感じ

42 :22:01/11/20 12:47
need モラセト

☆ メソッド呼び出しのテスト

クラス「 2chキャラ 」は「 オブジェクト 」を継承し
『 ハァハァ: とは " ハァハァ" を 文字列表示 』
を実装する

クラス「 モナークラス 」は「 2chキャラ 」を継承し
『 話せ: とは " オマエモナ〜" を 文字列表示し 自分 が ハァハァ。 』
を実装する

クラス「 ギコクラス 」は「 2chキャラ 」を継承し
『 ハァハァ: とは " ハゥッ" を 文字列表示 』
『 話せ: とは " 逝ってよし!" を 文字列表示し 自分 が ハァハァ。 』
を実装する

モナークラス モナー
ギコクラス ギコ

単語 駄スレ { 値 -- } を
ここから
値 から 1 を 引く → 値
値 が 0 以上
ならばその間
改行し
値 を 2 で 割った余り が 1 と 等しい
ならば
ギコ が
さもなければ
モナー が
つぎに
話せ。
を 繰り返し実行する
と定義

endload

43 :22:01/11/20 12:49
で、実行結果は↓

10 駄スレ

逝ってよし!ハゥッ
オマエモナ〜ハァハァ
逝ってよし!ハゥッ
オマエモナ〜ハァハァ
逝ってよし!ハゥッ
オマエモナ〜ハァハァ
逝ってよし!ハゥッ
オマエモナ〜ハァハァ
逝ってよし!ハゥッ
オマエモナ〜ハァハァ

44 :22:01/11/20 12:54
モナー が 話せ。
なら動的束縛。

話せ: モナー
なら静的束縛です。

助詞は実は読み飛ばしてます。
へたれでスマソ。

45 :デフォルトの名無しさん:01/11/20 18:22
52 PICK

46 :デフォルトの名無しさん:01/11/20 18:42
>>22

見てる分にはなかなか面白いかも。
Mopsってのは知らないけど、ForthとSmallTalkの
知識のみでだいたい理解出来るし。

47 :22:01/11/20 20:44
>> 46
自分でいうのもなんですが日本語化したリストを打ち込むのは正直メンドイ。
でも見た目重視なので名前付きパラメタへの代入記号が→だったりします。(w
SmalltalkはSqueakを以前ダウンロードしてみたことがありますけど、継続して
使ってみてないのであんまり知りません。
Smalltalkのメソッド呼び出しの語順を逆にしたものがMops‥‥?

48 :デフォルトの名無しさん:01/11/20 21:14
見るだけで満足できるスレだな。
良スレage

49 :デフォルトの名無しさん:01/11/20 21:29
さげ!
今後は新言語を発明しなかった奴にベストプログラマー賞をやれや。

50 :デフォルトの名無しさん:01/11/20 22:13
>>49
アイヤー、Mopsはちっとも新言語じゃねぇっす。
Neonという名前の商用製品だった頃を含めればMac用開発言語の中でもカナーリ古株ですね。
マイナーだけど。



でもsage。

51 :46:01/11/20 23:47
Transcript show: 'Hello World'

で、Transcriptオブジェクトにshow:メッセージを、
引数'HelloWorld'で送る。
Mopsの逆になってる?Mops知らんので良くわからん。

モナーが話せ。

という事は一緒に見えるが。引数がある時は

モナーが 'Hello World' と文字列話せ。

となる、という事か?

ギコとモナーの所のスタックにあるオブジェクトの種類で多態、
ってのは面白い気もする。
でもやっぱりはやらんだろうなぁ、こういう言語は。

52 :22:01/11/21 00:19
Mops的に表現すると、

" Hello World" show: Transcript

になります。パラメタ メッセージ オブジェクトの順。
コンパイラ部分にパッチをかましたオイラの日本語化Mopsだと


クラス「 モナークラス 」は「 オブジェクト 」を継承し
『 セリフを話せ: とは 文字列表示 』
を実装する

モナークラス モナー

" Hello, world" と モナー は セリフを話せ。

=> Hello, world

みたいな感じです。
つまり、パラメタ オブジェクト メッセージ の順。
もともとのMopsの構文も生きているので、

" Hello, world" と セリフを話せ: モナー

も実行できますけど。

53 :22:01/11/21 00:31
>>52
補足すると、Mopsが、インプットストリームから切り出したワードの
最後が『:』である事から、オブジェクトに対するメッセージか否かを
判別している箇所を拡張して、最後が『。』ならスタックトップの
オブジェクトへメッセージをsendするようにコンパイルしてます。
だから、パラメタはオブジェクトより前にないとダメです。
将来的に>>33の1)みたいな構文ができると楽しいとは思います。
あと趣味でやってみてるだけなので実用性は期待してませンです。(w

54 :22:01/11/21 00:43
>>50
でもNeonの頃は単一継承で動的束縛のみだったと思う。
ドキュメントのどこかで読んだだけで直接当時を知ってるわけ
ではないけれど。
オーストラリアのおじさんが残りの仕様を付け足した。
同じNeonから別れたYerkってのもあったハズ。

55 :デフォルトの名無しさん:01/12/08 13:10
自分 で 上げ。

56 :デフォルトの名無しさん:01/12/08 15:26
普通のFORTHスレってないの?
勉強してみたいんだけど。

57 :名無しさん@Emacs:01/12/08 19:14
ふつーにGNU Forthのドキュメントでも読めば
十分勉強できると思うよ。

58 :デフォルトの名無しさん:01/12/08 20:15
>>56
ハゲドー

59 :デフォルトの名無しさん:01/12/08 20:20
あげよう子供ライオン

>将来的に>>33の1)みたいな構文ができると楽しいとは思います

ところで、実際やろうとすると、どうやればいいんでしょうね。

文法については、レシーバーをメッセージの直前や直後に置くという文法にしないかぎり
やっぱり何らかの印がないとレシーバーだと判別できないんで。

あるいはレシーバーだけ「印がない」という案もあるが。
つまり助詞案みたいに、述語は「。」が、引数は「、」が、つくので
それ以外がレシーバーだ、という案。
ちょっと読みにくそうだけど。

コンパイルしたものの動かしかたについては、どうすればいいんだろうな。
postscriptでいう「mark」のようなものをstackに積み、
ここから1つのmessage sendingが起こる、ということを
おしえればいいだろうか。つまりstackに
mark receiver param1 param2 ...
と積まれた状態でmessageを実行すると
stacktopから(最初にみつかる)markまで掘り下げて
receiver とparamを拾ってくる、という。
これできちんと動くかどうかは検証してないけど。

60 :デフォルトの名無しさん:01/12/08 20:25
>>57
本を何冊か読んだけど途中からわからなくなります。
8ビットで遊んでみたいからforthみたいな小さい言語はぴったりだと思うのですが
逆ポーランドにいまだ馴染めません。

61 :デフォルトの名無しさん:01/12/08 20:27
>>56
とりあえず
http://www.google.co.jp/search?hl=ja&q=forth+%93%FC%96%E5&btnG=Google+%8C%9F%8D%F5&lr=lang_ja

普通のFORTHスレってム板に無さそう。
Mindスレが以前にあったけど、倉庫に入って久しいし。

FORTHスレの需要があるなら立ててみる?
PostscriptとかOpen Farmwareとかスタック系言語一般を扱うことにすれば、多少は人が集まるか?

62 :22:01/12/08 21:46
>>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みたいな言語になってしまう(笑)。
語順は逆だけどね。

64 :デフォルトの名無しさん:01/12/09 00:55
リアル厨房だけど。いれさせて。
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といってもいいのかなぁ。
勉強してみます。

68 :22:01/12/09 01:51
>>63
もちろん「無名ワード」はLispからのパクリです。
無名ワード案でいくと、ForthとLispとSmalltalkを多重継承して見た目が
日本語のキモい言語になる?
でも実装が面倒クサそう。

69 :デフォルトの名無しさん:01/12/09 02:04
FreeBSDのブートローダがForthで書かれている。

Forth総合スレ欲しいよ。

70 :デフォルトの名無しさん:01/12/09 02:06
>>69
ここでええんでないの?

71 :デフォルトの名無しさん:01/12/09 02:58
GNU GRUBも正直Forthなら良かった。
いまの設定ファイルは記述力が低すぎる。

72 :デフォルトの名無しさん:01/12/09 13:30
>>70
名称の問題ですね。mops知らん人は通りぬけちゃうかも。

ここが一杯になった暁(くるのか?)には「総合スレ」の名で大々的に起こす、では
やっぱりおそすぎますかね(^^;

スレに「別名つける」機能とか「リネームする」機能とかが
あればよかったのにな。ただ、あったらあったで変に濫用するやつが
後たたなくて困るだろうけど。

73 :67:01/12/09 13:41
>>72
>名称の問題
う〜む。「オブジェクト指向『FORTH』」とは書いてますけどねぇ。
やっぱり弱いか。
>別名とかリネームとか
イイ!(・∀・)かも〜
>変に濫用するやつが
ダメ!(´∀`;)かも〜

\ OpenFirmware + FORTHで検索かけてみました。
\ とりあえず
http://www.forth.org/
http://www.openfirmware.org/
http://join.t.u-tokyo.ac.jp/fig-japan/
http://www2.osk.3web.ne.jp/~lunlumo/Prog/Forth/
http://www.kt.rim.or.jp/~tyamamot/forthj/forthj.html
\ 情報少ないっすね…

74 :デフォルトの名無しさん:01/12/09 14:08
深度浅め。sageよし。

>>73
適当に検索してみた。よかったら参考にしてチョ

http://www2.airnet.ne.jp/sardine/complang/Forth.html
http://bishop.fuis.fukui-u.ac.jp/~nishino/hobby/prog/forth/
http://www.asahi-net.or.jp/~uw4s-wtnb/

開発環境
http://www.hoku-iryo-u.ac.jp/%7Esadakata/4th/index.html
http://home.interlink.or.jp/~s-nakani/doc/frtm-win.html
http://www.netlaputa.ne.jp/~kuno/forthmain.html

逆ポーランド
http://www.246.ne.jp/%7Etamra/stack.html

75 :デフォルトの名無しさん:01/12/09 16:32
forthのコードって出てますか?
富士通とか日立の8ビットパソコンに移植してみたいんですけど。
あとWIN−CE用のforthがあると助かります。

76 :中岡の玄ちゃん@似非ファーザー弁:01/12/09 17:32
深度25 sageるけぇのぉ

>>75 「forthのコード」
ソースのことか?だったら>>73-74のリンクにあるんじゃないんかのぉ。
不思議じゃわい。もののみごとに。

77 :デフォルトの名無しさん:01/12/09 22:24
物凄い勢いでオブジェクト指向FORTH製OSが立ち上がる画像キボンヌ
age

78 :デフォルトの名無しさん:01/12/10 01:15
盛り上がんねぇなぁ。いっちょあげ。

79 :デフォルトの名無しさん:01/12/10 02:53
さすがマイナー言語(w

80 :デフォルトの名無しさん:01/12/10 03:15
ちょい勉強してはじめてわかったけど、このスレの
タイトル、Forthのcolon definitionにちなんでるのね。

ダセェ顔文字かと思ってたよ…

81 :デフォルトの名無しさん:01/12/11 00:05
なるほど。気づかなかったよ。悪くないね。

82 :デフォルトの名無しさん:01/12/11 00:36
下のURLの所にANS ForthにMops風にオブジェクト指向拡張するソースが
あるんだけど、ANS Forth互換の環境で実際に試してみた人っている?

ftp://ftp.taygeta.com/pub/Forth/Applications/ANS/classM10.zip

オレのところではエラー出て止まっちゃうんだよね。

ftp://ftp.taygeta.com/pub/Forth/Applications/ANS/CLASS10.ZIP

↑こっちは動くんだけど、単一継承しかできないんだよねぇ。

83 :第4番目の名無しさん:01/12/11 02:20
>>82
ネタがあるならageようよ。(藁
漏れの所では試せません。スマソ。

>>26
パクリました。許可して。

84 :82:01/12/11 03:22
>>83
スマソ。ついクセで。
しかし最近の我が艦の深度は浅めぢゃのう。(違

>>漏れの所では試せません。スマソ。

ttp://www.forth.org/compilers.html

↑とりあえず。

GForthかpForthならたいていのプラットフォームで動くよ。
おヒマな人は試してみてね。

85 :デフォルトの名無しさん:01/12/11 19:32
42 pick

86 :デフォルトの名無しさん:01/12/11 19:33
>R

87 :デフォルトの名無しさん:01/12/11 19:34
>>86
アイゴー!

88 :デフォルトの名無しさん:01/12/12 23:57
今すぐL1-AしてOpenBootだ!

89 :サルベジ:01/12/13 00:52
今すぐ再起動 -> Command+Option+O+F してOpenFirmwareだ!

90 :デフォルトの名無しさん:01/12/13 11:01
そんで最後にFDISK/MBRしてCtrl-Alt-Delだ!

91 :22:01/12/15 01:23
>>42みたいなコードをANS Forth上で実行できるようにする代物を
>>82のリンク先のソースをベースにして今書いてます。
とりあえずCLASS10.zipのほうをもとにしているので多重継承はまだダメですが
その他の部分はそれらしく動作しているみたいです。
日本語の処理とか、いい加減にしかやってないのでハッタリもいいところですが。
たぶん明日ぐらいには公開できると思います。
GikoForthという名前にしようと思っているオイラは逝ってヨシ。

92 :デフォルトの名無しさん:01/12/15 09:28
期待アゲ

93 :デフォルトの名無しさん:01/12/15 11:42
期待age

94 :22:01/12/15 13:52
さげとこう‥‥‥。
http://www.geocities.co.jp/SiliconValley-SanJose/4733/

ターミナルから

include giko.fth

テストプログラムは、

include dasure.fth

testと打ち込んで改行。

95 :22:01/12/15 14:03
パーサーを全くいじってないので、半角スペースで
分かち書きしなきゃいけないです。メンドイです。
pForthの場合、辞書にはUPPER処理されて登録されてしまいますが、
なんとなく動きます‥‥‥。
へたれですまぬ‥‥。

96 :デフォルトの名無しさん:01/12/15 19:38
>>94
文字化けするYO!

97 :22:01/12/16 17:53
>>96
出力先をファイルにしてみてヨ。

でも結局、日本語を正しく扱えるANS互換FORTH処理系がないと
意味なしカモ‥‥。

pForthのソースを見ると、パーサーと辞書登録に関する部分はCで
書かれてるんだよね。
pForthはパブリックドメインなので付属のソースコードを書き換
えて日本語対応にすればいいんだけども。
MPWどこにしまっちゃったかなぁ。

98 :デフォルトの名無しさん:01/12/17 02:20
>>97
MacOSXに移ろうYO!
NSDictionaryで一発さ!HAHAHA!

99 :22:01/12/17 23:34
>>98
ソウナノカー。
でもオイラまだMacOSX持ってないのヨ。ホスィーヨォ
ってか、土曜日にうぷろーどしたソースにバグがアターヨ。(恥宇津氏
コソーリなをしたよ。
へたれでスマソ‥‥。

100 :デフォルトの名無しさん:01/12/18 00:16
>>99
簡単な処理系キボンヌ

101 :22:01/12/19 01:09
>>100
すぐに実行できるバイナリは用意したいとは思うけれども、
今、忙しいのでかなり気長にお待ち下さい。
あとオイラにはマク用しか用意できません。
(だれかオイラにG4を‥‥iBookでもいい‥‥クレ。)
あなたがマカーならフォントパチーンをインストールして、
フォント置き換えアプリにpFORTHを指定してから、
pFORTHと同じフォルダにGiko.fthを置き、pFORTHの
コンソールから
include Giko.fth
と打ち込んでreturnキーを押せば、取りあえず試してみる
ぐらいのことは出来ますよん。

102 :98:01/12/20 01:45
たまにはageんとな。

>>22
MacOSXに移ろうYO!カマーン!

103 :22:01/12/20 01:56
>>102
よっっしゃぁ!Let's OS Xっ!!
‥‥とまあいけばヨシ。
>>101であんなこと書いてますが結局、MPWでビルドし直すことに今日
手を付けてしまいました‥‥。
今宵のうちに例の場所にうぷしときます。

104 :98:01/12/20 02:00
OSXなのでなんとも言えないです。
Classic捨てたし。
昔もよかったなぁ…MPWか……

105 :22:01/12/20 02:14
>>104
あぁ!そうだったノカ〜。
Classic捨ててる人もいるのねん。
いま試そうとおもったんだけど、SIOWアプリはCarbonでビルドできないみたいねぇ。(鬱
すまないが、オイラがG4を手にする日までしばらくお待ちを。

‥‥>>98が自分でOS X上にビルドすると言う手もあるゾ。(ボソッ)

106 :22:01/12/20 02:51
うぷしました。
でもpForthをMPWのSIOWアプリにビルドし直して、
Giko.fthを自動で読み込むようにしただけ‥‥。
‥‥しかも今どきクラッシックアプリ。

‥‥‥‥‥へたれでスマソ。

107 :98:01/12/24 11:30
どうよヽ(´ー`)ノ

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

110 :22:01/12/24 17:11
>>108
をを!
tile-forthぢゃないですか。
一応オイラもチェック入れてます。
tile-forthのoop拡張はselfを常にスタックトップに残すんでしたっけ?

111 :22:01/12/24 17:14
>>110
自分でかいといてスンマヘン。
サンプル良く見ればわかりました。

112 :22:01/12/24 17:32
>>107
GikoForthのクラッシク版はとりあえず、辞書に日本語のワードが
UPPER処理されないような修正だけしてソース付きで、>>94
のリンクの場所に置いてますです。

‥‥G4買うべく働いてます。(;´Д`)

113 :デフォルトの名無しさん:01/12/24 20:35
なるほろ。
tile-forthってプロトタイプベースなわけですか。
で、クラスに基づく継承もできる、と。
勉強になりました。

114 :デフォルトの名無しさん:01/12/24 22:39
tile-forthってまだ生きてたの。
俺が知る限りUNIXプラットフォーム初のForth処理系だった。
でも、ANS標準以前の言語仕様だったような気がするなぁ。

115 :デフォルトの名無しさん:01/12/24 23:01
>>114
ソースの拡張子から想像するにFORTH-83系のようです。
まあ、FORTHは生みの親が「標準化なんてツマラン」みたいなこと
言ってるし、そのせいか、ANSはいつまでたってもドラフトのままだし。

116 :デフォルトの名無しさん:01/12/24 23:30
>115 C.Mooreのオッちゃんな。
尊敬してるけど、ラディカル過ぎて正直ついていけない。
COLOR FORTHとかまで逝っちゃうと、FORTHの本質って結局何?
ってなもんです。

117 :デフォルトの名無しさん:01/12/24 23:48
>>116
Color FORTHはついてけないです。
文字コードなんか5ビットもあれば十分とか言ってるし。(;´Д`)
世の中の流れと全然逆だよう。>ムーアのオッチャン。

118 :114,116:01/12/24 23:54
>117 なんかストレージはフロッピー一枚で十分とか言ってるしなぁ。
あ、でもForthチップの仕事とかは面白そうだったのだが、今どうなのだろう?

119 :115,117:01/12/25 00:07
>>118
Forthチップって良く知らなかったんですが、

ttp://www.ultratechnology.com/chips.htm

↑コレですか?
使われてるのかなぁ……??

120 :デフォルトの名無しさん:01/12/25 00:27
>119 興味深いURLをサンキュウ

HarrisのRTX-32とかは航空宇宙分野で結構使われたようです。

大昔にNovix NC4000のアーキテクチャに感動したことがあるんです。
パラメタスタックとリターンスタック専用データバスがあったり
一機械語中にFORTHのワードが複数埋め込まれててなかなか速そう。

121 :デフォルトの名無しさん:01/12/25 00:45
>>120
> HarrisのRTX-32とかは航空宇宙分野で結構使われたようです。
かっちょエエ〜!
さすが組み込みに強いFORTH(藁

122 :デフォルトの名無しさん:01/12/25 17:55
>>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

125 :デフォルトの名無しさん:01/12/28 20:15
>>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 )
リターンスタックのトップの内容を取り出してパラメタスタックへ積む。

126 :125:01/12/28 20:36
>>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ワッショイ!

128 :デフォルトの名無しさん:01/12/28 20:53
>>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
久しぶりのレス流れだ!
ワッショイ!ワッショイ!ワッショイショイ!!

133 :131:01/12/29 01:12
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

140 :139:01/12/29 02:11
途中で改行打っちゃった。
強烈な個性の持ち主であるのは確かですね。

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 のプログラミングってのは、その目的専用の新しい言語を
デザインするような作業だから、自由度さえ高ければ方言自体は
あまり問題にならないと思います。

145 :141:01/12/29 02:58
>>143
組み込み済みのワードとユーザー定義のワードに差が全くないという方面では
Lispも似たような感じですね。Lispはワードとは言わないけれど。

>>144
自分専用のワードを作っていくと、新しい言語を作っているような気分になって
きますね。そこがグっとくるところ。

146 :デフォルトの名無しさん:02/01/01 02:04
住人の少ないスレだが、貴様たち今年もよろしくage。

147 :デフォルトの名無しさん:02/01/01 02:09
>ALL そういうことなので、本年もよろしく。
深夜になると、上がるのね。

148 :デフォルトの名無しさん:02/01/01 05:45
forthで再帰処理とかってどう書くの?フィボナッチとか。

149 :デフォルトの名無しさん:02/01/01 06:56
あけおめ。
RECURSEっていうワードを使うよん。

フィボナッチ↓
ttp://bishop.fuis.fukui-u.ac.jp/~nishino/hobby/prog/forth/fib-com.fs

FORTHはすでに存在するワードの再定義が可能なんだけど、再定義の中で
再定義する前のワードを呼び出せるように、(オーバーライドしている
メソッド中でスーパークラスの同名メソッドを呼び出す所を想像すれば良い
かと思われ)定義中のワードが辞書探索でヒットしない代わりにすでに定義
されている同名ワードがヒットするようになっている。
ヒットしない自分自身の代わりに使われるのがRECURSEというワードなわけです。

ちなみにMopsは一応、末尾再帰の最適化をやってるみたい。

150 :デフォルトの名無しさん:02/01/01 12:14
あけおめ。

>>149
なるほど。
それを実装してみようと思うんだけど、
自分自身へのポインタを返すってことでいいのかな?

151 :149:02/01/01 14:58
>>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での実装方法)
ポインタ参照が少し増えるぐらいのオーバーヘッドだと思われ。

157 :デフォルトの名無しさん:02/01/02 01:26
お好み次第で自分流の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。

169 :167:02/01/04 03:29
ありがと。
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
;


176 :172:02/01/18 02:49
>>174
スマソ。普通のFORTH使ったこと無いんで間違えました。


177 :デフォルトの名無しさん:02/01/19 23:01
Win用の厨にでも使えるForth処理系キビンヌ

178 :デフォルトの名無しさん:02/01/27 19:09
生きてる?

179 :デフォルトの名無しさん:02/01/27 20:27
「フォース」って書いちゃ駄目?

180 :22:02/01/27 22:28
>>178
ごめん、半分死にかけ‥‥‥。
春になったらなんとか‥‥‥。


181 :デフォルトの名無しさん:02/01/27 23:47
>>180
我 君 許

182 :デフォルトの名無しさん:02/02/01 23:51
ficlってoopなの?

183 :デフォルトの名無しさん:02/02/03 20:41
>>182
一応できるみたいね。使った事ないけど。

http://ficl.sourceforge.net/ficl_oop.html



184 :デフォルトの名無しさん:02/02/03 21:39
いや、FORTHって豪快だな〜(笑
Perlの上を行ってるな〜
なんでも突き通せは思想なのかもなあ。


なんか関数型を使ったあと使うとめまいがしそうだ。

#FORTHに悪意のある書き込みではないので念のため。

185 :デフォルトの名無しさん:02/02/06 17:18
確かにとんがってる感はある。

186 :デフォルトの名無しさん:02/02/07 01:31
あげとくよ。

187 :デフォルトの名無しさん:02/02/09 00:29
もいっちょ

188 :デフォルトの名無しさん:02/02/09 01:10
結局さあ、使ってる人いるの?
おれスタック操作怖くてできない。

189 :デフォルトの名無しさん:02/02/09 01:27
FCodeを語れそうなスレはここだけですか?

190 :デフォルトの名無しさん:02/02/09 18:51
空ageしかできんなぁ。

191 :デフォルトの名無しさん:02/02/10 00:58
>>188
え〜と、Mac用のフリーソフトを作ったことならあります。
でも普通のアプリケーション開発にFORTHを使う人は大変めずらしいと思いマスです。
Open FirmwareとかOpen Bootとか向けにFORTHで書かなければならなくなった
デバドラ屋さんは結構いるかも知れませんが職業プログラマじゃないので知りません。
スタック操作は慣れると不定個の返り値をもつ関数とか引き数としてスタックに積んだ
値を使っても使わなくても良い多態とかトリッキーなコードを書いてしまうという
両刃の剣。でも面白いですよん。


192 :デフォルトの名無しさん:02/02/15 07:39
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, ;


193 :192:02/02/15 07:43
使用例:

クラス定義

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のコードを動かすには最低限、どのレベルの規格に準拠している
必要がある、とか。
なんだかその辺が混沌としてるイメージがあって、
なかなか取っ掛かかれないのれす。

195 :192:02/02/16 02:37
>>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
>>202
+ 激しく電波 +

204 :デフォルトの名無しさん:02/02/21 23:07
>>202
オブジェクト指向拡張部分をROMに焼いてチップ上に乗っけちゃえば
それっぽく見える代物になるか?
デムパっぽいな〜。

Color Forthもデムパっぽいけどナ〜。(´Д`)


205 :デフォルトの名無しさん:02/02/21 23:15
夢でも見ているのか。
このスレの稼働率とは思えない

206 :デフォルトの名無しさん:02/02/21 23:37
>>205
忘れた頃に上がるナリ。このスレの特徴ナリ。

http://hoge.s7.xrea.com/tiki/tiki.cgi?c=v&p=Forth

↑ム板 2ch TikiのForthのページ。ネタがあったら追加して欲しいナリ。
‥‥‥誰かPostscript、教えてホスィなり。


207 :202の名無し:02/02/22 16:46
Mopsのチップというのは作れるのですか。

208 :デフォルトの名無しさん:02/02/22 16:58
>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
なんだなんだ?何が起こった?業界に異変?

212 :デフォルトの名無しさん:02/02/23 01:38
211の脳内革命を確認。

213 :デフォルトの名無しさん:02/02/23 03:38
↓似非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> ;



214 :213:02/02/23 03:38
使い方
・スタック上に一次元配列を作る。

 (( 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
>>213-214
貴様それで何をたくらんでいる!?
まさか・・・世界征服かっ!?

216 :デフォルトの名無しさん:02/02/23 16:41
>>215
世界征服はJava VMにまかせた!!(゚∀゚)



217 :デフォルトの名無しさん:02/02/23 17:26
>>215-216
和んだ。

ていうかさ、変数使わずにスタックだけでガシコンガシコン
プログラム組んだら、何がよくなるの?

218 :デフォルトの名無しさん:02/02/23 17:39
>>217
局所性‥‥かな?


219 :デフォルトの名無しさん:02/02/23 23:55
>>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
http://www.limo.fumi2kick.com/forum/lm_forum02.html
Forthタン萌え

221 :デフォルトの名無しさん:02/02/28 00:49
>220 人気投票最下位...

222 :デフォルトの名無しさん:02/02/28 00:56
最下位ではぬゎーいっ!!
18人エントリー中の9位であーる。
9位入賞と言ってくれ。
でないと泣く。


223 :デフォルトの名無しさん:02/03/01 21:40
++forth

224 :デフォルトの名無しさん:02/03/06 22:08
Forth.NET

225 :デフォルトの名無しさん:02/03/10 01:37
#include <stdio.h>
#define cmdin ">>"
#define stksize 256

226 :22:02/03/10 04:23
数日前、つひにMac OS Xをゲトーしました。
Cocoaがまだ良く分からないので、Standard Toolでもって、
ターミナルから動くようにだけしてみたヘタレです‥‥‥。

http://www.geocities.co.jp/SiliconValley-SanJose/4733/



‥‥‥‥‥‥寝る。


227 :202の名無し:02/03/11 02:08
手続きもオブジェクトにしてifもwhileもメッセージと言う具合にできるでしょうか。Smalltalkのように制御構造もメッセージで実現するわけです。もしかしたらその方が実装が簡単になりませんか。

228 :22:02/03/11 07:00
‥‥‥‥‥‥起きた!
>>227
Smalltalkのようにすべてがオブジェクトな世界なら、その方が美しくてイイ気がします。
‥‥‥Forthのことは忘れて一から独自言語にしてしまいますか。
比較演算子がスタックの上にbool型のオブジェクトを生成すればいいのかな?
でifTrue;メッセージをsendするという具合に。
手続きオブジェクトがレシーバになるという実装もアリかも‥‥‥。
‥‥‥でも実装の手間の割に効率は良く無さそうなのでヤル気が萎えるです。
アリモノのif else thenでいいぢゃん、とForthプログラマとしては考えてしまいます。
でもライブラリとかのコードを書くときには、簡潔で見栄えの良い表記になるかも。
(実装というかコード記述が楽になるのはこのレベルに達したときですよね。)

ところで、手続き渡しをしたいときにForthプログラマは伝統的に、

['] someWord

みたいな感じで、あるワードのエントリをスタックに積んでおいて、適当な時に
executeしていたわけですが、もう少し真面目にブロッククロージャに相当するモノを
実装するというのはイイかもしれないです。



229 :22:02/03/12 23:49
急な思いつきでGikoForthを非分かち書き日本語風に
書けるようにしてみますた。

クラス「 ギコハニャ〜ン 」は「オブジェクト」を継承し
  『 話せ: とは"逝ってよし"を文字列表示し改行』を実装する

クラス「 ギコフッサール 」は「ギコハニャ〜ン」を継承する

ギコハニャ〜ン ギコ
ギコフッサール フサフサ

ギコが話せ。
フサフサが話せ。


みたいに。

内部的には非分かち書き→分かち書きの処理をかましただけなんですけど、
該当部分はGikoForth自身でGiko.fth内に書いてあるので、Project Builderを
持ってなくてもGikoForth自身でいじって遊べまふ。
>>226のリンク先にうぷしてあるので、存分にいぢって下ちい。


230 :202の名無し:02/03/13 03:00
条件分岐のネストで厄介なことになりそうです。
条件分岐の構文としては
条件成立時の手続き 条件不成立時の手続き 条件判定手続き ifメッセージ
(条件成立時の手続き、条件不成立時の手続き、条件判定手続きをスタックに積んで、
スタックトップの手続きオブジェクトがifメッセージを受け取る)
と言うものを考えていました。しかしこれで二つの条件分岐をネストすると
後から実行される条件判定が前に来てしまいます。
先に実行されるものが先に記述される上手い構文があるか、
それともこれこそオブジェクト指向FORTHらしい構文と思うか、
もう少し考えてみます。

231 :22:02/03/13 04:06
>>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

のように単純に並列ではダメなのですか?


232 :22:02/03/14 03:03
>>226
コソーリ非分かち書きのバグ潰しをしました。
しばらくまた放置するとおもいます‥‥‥。
ではでは。


233 :1:02/03/14 05:02
他の言語によくある構文で

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が先に来てしまうと言うことです。



234 :22:02/03/14 14:31
>>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メッセージは常にスタックの
二つ奥に送られると言うことでしょうか。

236 :22:02/03/15 20:27
>>235
_{ ." false" } がメッセージを受け取ればいいと思うんですけど。
どんなものでしょう?


237 :22:02/03/15 20:46
ところで、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 -- } ;


239 :202:02/03/19 00:08
>>236
このばあい_{ ." false" }では
どのようなメソッドを実行したらよいのでしょうか。
Smalltalkではtrue(false)クラスではtrue(false)の場合の手続きだけを実行する
と言う風にしていますが、上手いメソッドが思い付きません。

240 :22:02/03/19 01:13
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 )
というスタック操作ワードを使用していますが。


241 :22:02/03/19 01:17
えせMops表記で分りにくかったらごめんなさいです‥‥。


242 :デフォルトの名無しさん:02/03/19 01:30
>>240
Forthの構文ってきれいだね。
おもしろそうだな。

243 :デフォルトの名無しさん:02/03/20 17:20
>>240
over :ifTrue
self swap :ifFalse
でもいい?


244 :22:02/03/21 00:48
>>243
あう。そのほうがシンプルですねぇ。
-rotなんていうマニアックな命令をつかわなくて良いし‥‥。
恥ずいのでsage


245 :202の名無し:02/03/22 01:26
裏で手続きが前にくる構文を使っているのですね。
これなら表でこの構文を使う方が好みです。

246 :22:02/03/22 02:18
>>245
あくまでもオブジェクトにこだわった実装の場合のシンタックスシュガー
ってことで。てへへ。
自分がやるときはFORTHのプリミティブ使って手続きクラスに直接実装しちゃうと思います。


247 :22:02/03/22 02:20
下げたまんまだった‥‥。
いちおうあげときます。


248 :デフォルトの名無しさん:02/03/22 09:53
わけわからん。
説明されても、やっぱりわけわからん。
おれには一生理解できないのか。

249 :22:02/03/22 20:14
>>248
わかりにくくてスンマソン。(T-T)
ローカル変数を使って、

:m :if { oBool oProcT -- }
  oProcT oBool :ifTrue
  self oBool :ifFalse
;m

でもよかったんだけどそれじゃ身も蓋もないと思ったので‥‥。
スタック操作は確かにわかりにくいと思います。自分も書くときはすぐに
ローカル変数を使って楽をします。

話は変わりますが、ブロックが前にくるタイプのif文のオブジェクトの
スタック上の順番をどうするのが良いか、もう少しいろいろと議論した方が
良いのかもしれませんね。



250 :22:02/03/23 03:54
↓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 :ムーア:02/04/01 02:33
空揚げ

253 :22:02/04/07 02:20
>>252
いつもメンテしてくれてありがとん。


GikoForth : http://www.geocities.co.jp/SiliconValley-SanJose/4733/
なんだかんだでやっぱり気になるので、また手を付けてしまいました‥‥。

オブジェクト拡張を>>82のclassM10ベースに移行しました。
というわけで多重継承可になりました。
動的束縛しまくるGikoForthの場合、多重継承ベースのクラス構成だと、
遅くてたまらんとオモタのでスーパークラスを持てずインスタンス化
できないmix-inモジュールを定義できるようにしまひた。
非分かち書き拡張部にでっかいバグがあったので潰しました。
そのためすこし構文が変更になりました。

あー今度こそヤメルぞ‥‥‥。



254 :コピペですまん:02/04/10 00:01
☆ モナーとじゃんけんゲーム

★ クラスの定義
クラス「じゃんけんモナー」は<オブジェクト>を継承し
  ☆ メソッドの定義
  『手: ( -- 手 ) とは
    3までの乱数に1を足す』
  『表示: { 手 -- } とは
    手が1と等しいならば"ぐー"を表示つぎに
    手が2と等しいならば"ちょき"を表示つぎに
    手が3と等しいならば"ぱー"を表示つぎに』
  『じゃんけん: { | 相手の手 モナーの手 -- } とは
    ここから
      "なにをだすモナ? 1:ぐー 2:ちょき 3:ぱー それ以外:やめる"を表示し改行
      数値入力→相手の手
      自分の手。→モナーの手
      相手の手が0以下相手の手が4以上のどちらかならば逝ってよし
      つぎに
      "あなたの手:"を表示し相手の手を自分で表示。改行
      "モナーの手:"を表示しモナーの手を自分で表示。改行
      モナーの手と相手の手が等しいならば
        "引き分けモナ"を表示し改行
      さもなければ
        モナーの手から相手の手を引き1と等しい
        モナーの手から相手の手を引き-2と等しい
        のどちらかならば
          "あなたが勝ったモナ"を表示し改行
        さもなければ
          "モナーが勝ったモナ"を表示し改行
        つぎに
      つぎに
    を再び繰り返し』
を実装する

★ 「じゃんけんモナー」クラスのインスタンス「モナー」の生成
じゃんけんモナー「モナー」

☆ 「モナー」インスタンスの「じゃんけん」メソッドを起動
モナーとじゃんけん。

255 :デフォルトの名無しさん:02/04/18 21:22
深度280。sageヨシ。


256 :デフォルトのムーアたん:02/04/22 22:29
「メンテ」

257 :22:02/04/27 13:40
深度406より浮上。
>>256
ムーアたん‥‥(;´Д`)ハァハァ

GikoForth : http://www.geocities.co.jp/SiliconValley-SanJose/4733/
更新しますた。

Objective-CのCategoryぽいものを実装。
インスタンス変数は追加できないところがCategory風(?)。
(ところでアスペクト指向ってなんすか?)

JTerminalを使用するにはデヴェツールでビルドが必要なことに
いまさら気が付いてFinderから起動することのできるGikoForthX
アプリケーションをでっちあげますた。

これでようやく本当にデヴェツール持ってなくてもお試しできます。



258 :22:02/04/27 13:42
いま一つ気になることが‥‥‥。
ライセンスってどうするべきなんでせう??
pForthはパブリックドメイン。
classM10とBNFパーサーはライセンス不明。
たぶんパブリックドメインのような気がします。
(Forthコミュニティの伝統??嘘かも。でもMopsもPDSだし。)

GikoForthはGPLにすべきなんだろうか?
パブリックドメインでもいいのかな?
迷ってます。

あとターミナル版GikoForthは他のUNIX系OSでもコンパイルし直すだけで
そのまま動作するような気がします。
‥‥‥‥‥makeファイルってなんすか?(T-T)


259 :ダミー・ムアー:02/04/27 18:13
>>258
>ライセンスってどうするべきなんでせう??
全部自分で作れば即解決。ガンバ!
>迷ってます。
全部自分で作れば即解決。ガンバ!
>‥‥‥‥‥makeファイルってなんすか?(T-T)
ググールで【マケファイル】って検索したらでてきます。

260 :22:02/04/27 23:19
>>259
ダミーたん‥‥(;´Д`)ハァハァ


>全部自分で作れば即解決。ガンバ!

Cocoaネイティブに作り直すときにフルスクラッチに‥する?(氏

> ググールで【マケファイル】って検索したらでてきます。

http://www.google.co.jp/search?q=cache:Ex07HNJGMYUC:www.topworld.ne.jp/tw/red/sakura/0101/0112.html+%81y%83%7D%83P%83t%83%40%83C%83%8B%81z&hl=ja

(;´Д`)ハァハァ (;´Д`)ハァハァ (;´Д`)ハァハァ


261 :デフォルトの名無しさん:02/05/06 23:24
Mops 5.01が出たみたいです。

ftp://jamsoft.com.au/mike_hore/Mops/

age

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タンに
フィードバックしてくだちい。
今すぐに!




266 :デフォルトの名無しさん:02/05/08 00:30
>>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!

271 :デフォルトの名無しさん:02/05/16 19:06
そういや、comp.lang.forth.macの投稿記事の半分ぐらいが
OpenFirmware関係だったりするなぁ。
時代は変わった‥‥。

ググルでもみられるYO。
http://groups.google.co.jp/groups?hl=ja&group=comp.lang.forth.mac



272 :デフォルトの名無しさん:02/05/24 05:39
保守

273 :>222タン作 GokiForth:02/05/26 19:50
スレッド 安芸る

274 :デフォルトの名無しさん:02/05/26 23:37
>>273
あがってないよ。なんで?


275 :273:02/05/28 00:20
どうなってんだ?

276 :デフォルトの名無しさん:02/05/28 00:32
>>275
ちゃんとあがってるよ。
更新されてないだけでしょ。

277 :22:02/05/28 01:17
更新しますた。。。

‥‥いやネタじゃなく。ついでに移転しました。

GikoForth : http://gikoforth.s13.xrea.com/

実はxreaがめずらしく一般サイトの募集をやっていたので出来心でスペース
とっちまいました。

更新内容ですが、文字列と手続きブロックをオブジェクトでラップしてみました。

"逝ってよし" とか 【2を掛けて1を足す】とかは
それぞれ「文字列」「ブロック」クラスのオブジェクトをスタックに返します。

肝心のクラスライブラリの中身はスカスカに貧相ですが、カテゴリを使って
クラスを派生することなくメソッドを追加したり置き換えたりできるので、
とりあえずこの段階で公開しときます。

Cocoaネイティブ版を作りかけましたが、ヘタレなんで何年かかるかワカランです。
ちょとやる気が萎えますた。



278 :22:02/05/28 01:32
ちなみに「ブロック」クラスの中の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がオブジェクトじゃないので、この順番でしか書けないんですよね。




279 :ムアー:02/05/29 12:51
XREAはもうs13までいってるのか。
ワシんとこはs8です。3ヶ月ぐらい前かな。
早ぇ。

280 :デフォルトの名無しさん:02/05/30 00:33
>>279
ムアーたんのサイトってどんなんだろ? (;´Д`)ハァハァ


281 :チャルーズ・ムアー:02/05/30 02:14
再起下降でゴリゴリ書いた変な処理系とか
躁病患者を一気に鬱病患者にするほどのネガティブ天体観測日記等です。
もちろんデフォルトで電波を通常のサイトの3倍(赤)飛ばしています。
天文台から。ムアー(´∀`)

282 :名無しのワードさん:02/05/31 06:36
>281
ネタに聞こえないところがアレですなぁ…

283 :デフォルトの名無しさん:02/05/31 12:54
>>281
おながい、キーワードをもう1ワードだけ‥‥‥。(;´Д`)ハァハァ

>>282
http://www.colorforth.com/
‥‥‥‥ネタにしかみえない自分は、聖地巡礼の旅にでてきます‥‥‥。






284 :デフォルトの名無しさん:02/06/06 19:52
F#出たね。
Forthじゃないけど。

285 :22:02/06/09 01:58
>>284
F#って?ocamlってなに〜?と思いますた。
functionalのFだたのか。

http://gikoforth.s13.xrea.com/
更新しました。

またしばらく放置になりそうです。


286 :デフォルトの名無しさん:02/06/10 18:09
>>284
ていうかあったよ、Forth.NET

http://www.codeproject.com/dotnet/dforthnet.asp



287 :デフォルトの名無しさん:02/06/11 16:46
>>286
Oh my GOD !

288 :トリップの ◆8VdVxENI :02/06/11 23:11
してみる。

289 :202:02/06/21 05:29
ところで他の言語ではキーワードを行のはじめに置いて字下げをしますが、
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 :デフォルトの名無しさん:02/06/21 09:05
>>289
逆Python記法??


291 :デフォルトの名無しさん:02/06/21 16:19
>>290
THENやELSEは書いているみたいなので段差でブロックをあらわしてるわけでは
ないと思うが‥‥‥


292 :22:02/06/23 00:47
>>289
202さん、おひさしぶりす。
これはキーワードが右側に並ぶのがミソつうことですか‥‥?

ああん、だめ、脳がついてけないです。
(;´Д`)

293 :デフォルトの名無しさん:02/06/30 00:13
Mops5.1.1リリースあげ。

http://www.panix.com/~goshawk/Mops/_download.html



294 :      :02/07/05 00:11
 わっしょい


295 :デフォルトの名無しさん:02/07/07 18:31
古本屋で買っちゃったよ。
「パソコンユーザーのためのForth入門」age

296 :デフォルトの名無しさん:02/07/10 11:55
Forth インタプリタをもった、 ブートローダ 作りたいんだけど、 ここでよろしいですか?

297 :デフォルトの名無しさん:02/07/10 22:01
>>296
ブートローダはわかんないけど、Forthの話題ならここで可かと。


298 :デフォルトの名無しさん:02/07/13 21:36
ANS FORTHの規格の日本語訳と言うのは存在するんでしょうか?
訳してみようと思っているんですが、もしもう存在するなら無駄なこと
はしたくないので。

ご教示おながいします。


299 :デフォルトの名無しさん:02/07/13 23:02
>>298
ない、と思います。少なくともネット検索でひっかかる範囲には。
(私も見つけられなかった。)

ftp://ftp.taygeta.com/pub/Forth/Literature/ansforth.pdf

↑ANS Forthの規格書でこれが一番新しいのかなぁ?
手伝いたいけど英語苦手なので‥‥機械翻訳でよければ‥‥‥‥(T-T



300 :デフォルトの名無しさん:02/07/13 23:03
さげちゃった。
揚げ。


301 :デフォルトの名無しさん:02/07/14 00:44
漏れ、今ほそぼそとDPANS94翻訳中

302 :22:02/07/14 22:33
>>301
神!








‥‥‥地味に更新しますた。
http://gikoforth.s13.xrea.com/

303 : ◆dPyZXuuM :02/07/14 23:34
>>302
Wikiかなり充実してま砂。
このスレの閲覧者、意外に多いのか。

304 :22:02/07/15 00:25
ヽ(;´Д`)ノムーアたんハァハァ

↑お茶目さん

‥‥それはともかく、
>>303
>このスレの閲覧者、意外に多いのか。

どうなんでしょう。(T-T

http://gikoforth.s13.xrea.com/wiki/wiki.cgi?RecentChanges
Wikiは、この辺↑から更新状況をチェックしてお好みの所に自由に書き込んで
いただけますと、涙でるぐらいウレスィかも。
ページも勝手にジャンジャン作って良いです。いや、ホント。
おながいします。



305 : ◆dPyZXuuM :02/07/15 01:28
勝手に作った(´∀`*)

306 :22:02/07/15 13:02
ありがとん。玉しゃぶろうタン‥‥‥‥。


307 :301:02/07/15 23:37
DPANS2.htmアップップ。
で、DPANS3.htm翻訳中。

ページ数少ないし、分担したらサクサクっと終わるような気がするんだけど、
どうよ。

308 :22:02/07/16 00:11
http://www.taygeta.com/forth/dpans.htm
↑ココですね。

じゃ、せっかくだから漏れはdpans6.htmをやるぜ!!

……でも今日は寝ます。ゴメソ。


309 :デフォルトの名無しさん:02/07/16 00:26
すげ。神降臨。
http://gikoforth.s13.xrea.com/wiki/wiki.cgi?DPANS2%2EHTM%A4%F2%CB%DD%CC%F5%A4%B3%A4%F3%A4%CB%A4%E3%A4%AF%A1%C1

97 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)