■掲示板に戻る■ 全部 1- 最新50

Brainf*ckならぬBrainfree仕様書

1 名前: 俺◆DEjvjVnQaz :2014/04/27(日) 21:47:56.0 ID:2eZnwih+l
言語仕様

Brainf*ck 命令
・> ポインタをひとつ進める、後続の数値がある場合、その分だけ進める (ex., >, >10, etc..)
・< ポインタをひとつ戻す、後続の数値がある場合、その分だけ戻る (ex., <, <10, etc..)
・+ ポインタの指す要素の値を1つ増やす、後続の数値がある場合、その分足す (ex., +, +10, etc..)
・- ポインタの指す要素の値を1つ減らす、後続の数値がある場合、その分減らす (ex., -, -10, etc..)
・. ポインタの指す要素を出力する
・[ 0なら対応する ] までジャンプ
・] 対応する ] までジャンプ

拡張命令
・~ ポインタの指す要素の値の分だけスリープ (ms)
・` ポインタの指す要素の値を0にセット、後続の数値がある場合、その値をセット (ex., `, `10)

拡張スタック命令
・^ ポインタの指す要素の値をスタックにプッシュ
・! スタックのトップを取り出してポインタの指す要素の値に代入
・/+ スタックの上から1つ目の要素と2つ目の要素を足してスタックの上に置く
・/- スタックの上から2つ目の要素から1つ目の要素を引いてスタックの上に置く
・/* スタックの上から1つ目の要素と2つ目の要素を掛けてスタックの上に置く
・// スタックの上から2つ目の要素から1つ目の要素を割った値をスタックの上に置く
・& ポインタの値をスタックにプッシュ
・* スタックの値をポインタに代入

特殊文字
・(`12) 画面をクリア



2 名前: 俺◆DEjvjVnQaz :2014/04/27(日) 22:07:01.0 ID:2eZnwih+l


3 名前: 名無しさん@ふりーち :2014/04/27(日) 23:16:21.0 ID:woirLXMAw
BFerのおまいらには言うまでもないが、初めてのおまいらもいるだろう
そこで簡単なBF入門を書いていこうと思う

まずBFを書くときは二本のテープを想像する所から始める

片方はプログラムが書いてあるテープ
もう片方は全て0が書かれているテープだ


4 名前: 名無しさん@ふりーち :2014/04/27(日) 23:19:57.0 ID:woirLXMAw
この二本のテープがついた機械を操作するコマンドを入れるのが
BFerのおまいらができることだ

ポインタとか小難しいことが書いてあるが知ってみれば何てことはない
片方の全て0が書かれているテープを操作するだけに過ぎない


5 名前: 名無しさん@ふりーち :2014/04/27(日) 23:24:49.0 ID:woirLXMAw
まず >, < でテープを右,左にひとコマずらすことができる
+, - はそれぞれテープヘッドの場所の数値を足したり引いたりできる

これを使うとたとえば「+>++>+++」は1回足して右にずらして2回足して
右にずらして、3回足すといった操作を書くことができる。

これでテープの中身がどうなっているのか想像してみるといいだろう


6 名前: 名無しさん@ふりーち :2014/04/27(日) 23:40:24.0 ID:woirLXMAw
さて>>5の答えは分かっただろうか。答えは「実行」をクリックして確認してくれ

次は文字を出力するコマンド「.」だ。これはテープヘッドの数字を文字として出力する。
コンピュータは文字を直接理解することができないから、文字は数字と対応させているのはご存知のことだろう

「.」コマンドは数字から文字の変換と出力の両方をやっている


7 名前: 名無しさん@ふりーち :2014/04/27(日) 23:50:58.0 ID:woirLXMAw
最後にループコマンドだ。これは条件によってテープを対応する[, ]に飛ばすコマンドだ
[ を使えば0だったら対応する ] までプログラムのテープヘッドを送る

ところでプログラムのテープヘッドはどうやって動くのかご存知だろうか
ご存知でないおまいらのためにここで解説しておこう

プログラムのテープは一番左から順番にプログラムが一文字ずつ(場合によっては数文字)
入っており、一文字(1コマンド)読んで実行しては右に1つ移動する。これだけだ

しかし、ループコマンドの時は別で「[」の時はデータテープのヘッド位置に0が入っていたら
強制的に対応する「]」まで移動する「]」の時は条件なしに対応する「[」まで移動する


8 名前: 名無しさん@ふりーち :2014/04/27(日) 23:54:40.0 ID:woirLXMAw
一応これだけあればプログラムは書けるようだが、不便でしょうがない
なにせ10を表すのに「+++++++++」と書かなくてはいけない

なのでこれらを簡単にするため拡張を施した
「+10」みたいに後続に数字を入れるとその分だけ足す仕様にしてある

他にも直接数値を入れたいという事もあるだろう
そのため「`」(バッククォート)コマンドを用意した
「`10」みたいに書くと直接数値をデータテープのヘッドに書き込むことができる


9 名前: 名無しさん@ふりーち :2014/04/27(日) 23:57:38.0 ID:woirLXMAw
次に解説するのはアニメーション用スリープ命令「~」だ
これを使えば描画途中にスリープを入れてアニメーションを作ることができる

たとえば、これまでの書いたものを応用するとHello, worldは↓みたいに書ける
{bf:>`72>`101>`108>`108>`111>`44>`119>`111>`114>`108>`100>`33[<]>[.>]}


10 名前: 名無しさん@ふりーち :2014/04/28(月) 00:04:36.0 ID:+ZVOsEhZs
これを少しづつ待ちながら表示するようにしてみるとこうなる
{bf:>`72>`101>`108>`108>`111>`44>`119>`111>`114>`108>`100>`33[<]>[.>>100`200~<100]}
H e l l o , w o r l d ! ^~~左端まで移動
200ms毎に1文字出力~~~~~~~~~~~~~~^

>100は右に100こ移動で捨てテープに200書き込んでその分スリープしている


11 名前: 名無しさん@ふりーち :2014/04/28(月) 00:05:25.0 ID:+ZVOsEhZs
とりあえず今日はこんな所で。スタック拡張については後で説明します。


12 名前: 名無しさん@ふりーち :2014/04/28(月) 00:14:53.0 ID:+ZVOsEhZs
あ、コメントの書き方だけ、下みたいに書けます。
^`[ ..コメント.. ]!

実は命令だけど、意味を考えれば分かると思う


13 名前: 名無しさん@ふりーち :2014/10/09(木) 21:27:25.0 ID:poZWb9ME4
アニメーション作成用ツール(暫定)
http://free2.ch/assets/beta/bftools/anim.html
デバッガ(暫定)
http://free2.ch/assets/beta/bftools/debug.html


?? KB
新着レスの表示

掲示板に戻る 全部 次100 最新50
クリエイティブ・コモンズ・ライセンス

このページのドキュメントは全て クリエイティブ・コモンズ 表示 - 継承 3.0 非移植 ライセンスの下に提供されています。