v1.0 仕様 ■ 基本的な考え方 1 + 1 のような中置記法(一般的な書き方)はできません。 代わりに 1 1 + (後置記法)のように書きます。 値やコードはまず「stack(スタック)」と呼ばれる場所に順番に積まれます。 命令は、このstackの上の値を取り出して実行します。 ※ [1]は[2]「stackの一番上(最新の値)」、 は「上から2番目の値」を意味します。 ■ 命令一覧 ・dup [1]を複製してスタックに積みます。 例: 1 2 3 -> 1 2 3 3 ・dup2 [1]と[2]を複製してスタックに積みます。 例: 1 2 3 -> 1 2 3 2 3 ・drop [1]を削除します。 例: 1 2 3 -> 1 2 ・swap [1]と[2]の順番を入れ替えます。 例: 1 2 3 -> 1 3 2 ・rot 一番下を一番上に持ってきます。 例: 1 2 3 -> 2 3 1 例: 1 2 3 4 5 -> 2 3 4 5 1 ・+ - * / [2]と[1]を取り出して計算します。 例: 10 2 / -> 5 ・int [1]の小数点以下を切り捨てます。 10 3 / int -> 3 ・. (ドット) [1]を出力します。 例: 10 . -> 10を出力 ・ [ ] 囲んだ処理を実行せずにそのままコードブロック(文字列)としてstackに積みます。 ※カッコの内側には必ず半角スペースを入れてください。(例: [ ~ ] ) ・if stackから[1][2][3]を取り出します。 [3]が0以外(1など)なら[2]を実行し、0ならを[3]実行します。 例: 1 [ 10 . ] [ 20 . ] if -> 10 を出力 ・fn <name> = <処理> 関数を定義します。 例: fn square = dup * 5 square . -> 25を出力 ■ コメント・メモについて 専用のコメント記号(// など)はありません。 ただし、Blockは「行ごと」にstackが自動で削除されるため、出力命令(.)さえ含まなければ、どんな文字を書いてもプログラムの動作に一切影響を与えません(自由に行内メモが書けます)。 アップデート情報 v1.3 管理者機能を追加しました。 メモリなどの変数は使いたくなかったのですが、コードの短縮化のため使わざるを得ませんでした。 なので、Brockの美しさは残しつつ、後付け設定としてメモリの機能を追加することにしました。 ・+admin 管理者機能を有効にする ・load メモリの[1]番目を読み取る 例: 10 load ・store メモリの[2]番目に[1]を書き込む 例: 10 30 store ・alloc メモリの[1]個分空いているスペースを探して、その最初の番地を返す 例: 30 alloc ・base 1~[1]までのメモリを予約メモリとしてとっておき、allocで破壊されないようにする 例: 100 base 30 alloc (-> 101) ・memcpy [3]から[1]個を[2]からのメモリにコピーする 例: 100 200 10 memcpy (100~110番目を200~210番目にコピーする) ・memset [3]から[1]個を[2]に置き換える 例: 100 0 10 memset (100~110番目を0に置き換える) v1.2 ペン機能を追加しました。 ・pen_down ペンを下げる ・pen_up ペンを上げる ・go (x,y)=([2],[1]) ・cls 全部消す v1.1 ・# <ライブラリ名> ライブラリの関数を追加できるようになりました。 # math ・pi 円周率 ・rad 度数法->弧度法 ・abs 絶対値 ・int2 小数第二位までで切り捨て ・sgn 正なら1 負なら-1 0なら0 ・sin 正弦 ・cos 余弦 ・tan 正切 ・sqrt 平方根 ・% 余り # random ・rand 0~[1]-1までの乱数 定数を追加しました。 :y = 年 :mo = 月 :d = 日 :h = 時 :mi = 分 :s = 秒 中を見てプログラムを組んでね。
下を見るといいことがあるかも。 ☆豆知識☆ 関数は値を上書きすることができます。 なので、関数を変数として使うこともできます。 fn num = 10 num . -> 10 ただし、相互参照がないように気をつけてください。 fn a = b 1 + fn b = a 1 + a . のように、それぞれが参照しに行くと無限ループに陥ります。 上を見るといいことあるかもね。