Hatena::Grouprubyist

たばさの RSSフィード

01/09(水) 2008

スタックを使う。

| スタックを使う。 - たばさの を含むブックマーク はてなブックマーク - スタックを使う。 - たばさの

スタックは扱いやすいんだな。作る分には。

こんなものを作っています。


tes.by (script)

0101"test".,?s?d:var ?v"3.times{puts 'test.',v('var')}".,.x?s`echo "ok."`,

結果

>ko-bytecodetes.rb tes.by
Hello, world!
おはよう
Hello, world!
おはよう
test
["test"]
!=>sys "=>pushquote $=>varpush *=>mul +=>plus ,=>stackpr -=>minus .=>dup /=>div
0=>hello 1=>oha 2=>puts 3=>jp 4=>jp- 5=>jpto 6=>dicgets 7=>adrlensw 8=>adrintsw
9=>call :=>assign ;=>discard ?=>dump @=>repeat D=>dicset I=>to_i L=>jpLabel P=>p
air S=>to_s `=>exec a=>ret b=>cmp c=>dicl d=>dicstack e=>getsbuf g=>pop p=>putsb
uf q=>halt r=>dicrot s=>dicswap u=>push v=>buf x=>eval
{"var"=>"test"}
3.times{puts 'test.',v('var')}
test.
test
test.
test
test.
test
["3.times{puts 'test.',v('var')}", 3]
"ok."

>

って言われてもね。


ソースがランダムな文字列になるような何か。

memo

| memo - たばさの を含むブックマーク はてなブックマーク - memo - たばさの

/name 200 def

=>/により名前「name」をスタックに置く。「200」をスタックに置く。

 defでスタックから値を取り出しnameに200を定義する。

/name { 200 == } def

=>nameに実行可能配列「200 ==」(200を表示)を定義。

定義した手続きはスタックの値も使えるので

/sanbai { 3 mul } def 
400 sanbai ==

=>1200を表示。

となる。


defは現在の辞書userdictにkeyと値を登録する。

ローカルに使うときは新しい辞書に登録する。

3 dict

3つの要素を持つ新しい辞書。まだオペランドスタックにある。

3 dict begin

beginで辞書スタックに移動される。いらなくなったらendでその辞書は破棄される。

手続きなどでスタック上の値に名前をつけるにはexchでスタックトップの2つを入れ替える。

/kaki exch def
4 7 le { 5858 == } if

if文。4<7なので5858が表示される。

3 3 eq { 33 == } { 44 == } ifelse

if-else。3イコール3なので33が表示される。

4 { 4321 == } repeat

4回{}内を実行する。(4321を4回表示)


参考

http://monado.14.dtiblog.com/blog-entry-30.html

つづき

| つづき - たばさの を含むブックマーク はてなブックマーク - つづき - たばさの

とまあstackって面白いなと。無関係だけどたまたま読んでたので作るほうにも影響する。でも適当なので引数の後置と前置がごちゃごちゃになってます。

上の中間コードっぽいものを元コードに直すとこうです。といっても実装してないのであるとすればということです。実装しないかも。

stack関連の操作には_を付けました。だいぶ読みやすくなりました、といっても読むのは俺だけですが多分。

p.hello p.oha p.hello p.oha
_push-quoted (test)
_dup _print
dump-all
_assign var
dump-var.dictionary
_push-quoted (3.times{puts 'test.',v('var')})
_dup _print _dup _ruby-exec
dump-stack
exec (echo "ok.")
トラックバック - http://rubyist.g.hatena.ne.jp/hatecha/20080109
カレンダー
<< 2008/01 >>
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
archive Error : RSSが取得できませんでした。