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

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

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

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

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のように制御構造もメッセージで実現するわけです。もしかしたらその方が実装が簡単になりませんか。

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

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

read.cgi ver 05.04.02 2018/11/22 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)