レゴキチ/里々でスクリプトを本物のプログラムっぽく見せる方法

見掛け倒し命

実際には大したことはない。

括弧の関係が見やすくなっただけ。

里々の内部関数nop内では改行が無視されることを生かしているが、
nop内の値は捨てられてしまう為、結果表示やそのための変数の処理が複雑化してしまうのが難点。

基本形

@関数名
(nop,
【タブ】(if,条件式
【タブ】【タブ】,条件式真の時返す値
【タブ】【タブ】,条件式偽の時返す値
【タブ】)
【タブ】(
【タブ】【タブ】(if,条件式
【タブ】【タブ】【タブ】,if内で実行されたくない括弧の中身→例「set(spritf,%c,1)変数(spritf,%c,1)1」
【タブ】【タブ】)
【タブ】)
)(ifで返す値を表示するかしないか)(callの引数つき再帰呼び出し)(変数の削除)

気をつけること

タブの代わりに半角スペースはアウト

ifないのsetは勝手に実行されてしまうので二次引数区切(命名)を使って実行を遅らせる

最後に変数の削除が行なわれるので(変数「」の存在)を条件式に使うのは危険

if文

里々では内部の括弧から実行されていくので

(nop,
	(if,条件式
	 	,(set,変数,0)
	)
)

このとき、条件式が偽でもsetが実行されてしまう。

そのため、

(nop,
	(
		(if,条件式
			,set
			,nop
		)
	,変数,0)
)

こうしてsetの実行を遅らせる必要がある。

また、引数区切りを複数使うことで

(nop,
	(
		(if,条件式
			,set(sprintf,%c,1)変数1(sprintf,%c,1)0
			,set(sprintf,%c,1)変数2(sprintf,%c,1)5
		)
	)
)

としてしまうことも出来る。

for文

*
1+1+1+1は(call,関数1,4)

@関数1
(nop,
	(set,結果,
		(calc,
			(if,(変数「結果」の存在)==1
				,(結果)
				,0
			)+1
		)
	)
)(if,(結果)==(A0),(結果))((if,(結果)==(A0),nop,call),関数1,(A0))(set,結果,)

0+1+1+1+1・・・を繰り返す。

通常とは違うif文と、再帰呼び出しのみのループをどう使いこなすかが鍵となりそう

今思えば(nop)最終行の処理として、(返す値の表示)(ループの為のcall)(変数の初期化)の順番が最適かも。

サンプル

「里々でループ処理」で作ったやつの強化改造&見栄え向上版。

※これは実験的に作ったので上記の構文になっていない。
条件式に(変数「」の存在)を使ってしまったため、$_memoryだけが消去できない。

(call,格納関数,前半文字列,変数の初期値,後半文字列,変数の増加量,変数の最大値,区切)

(R*)や(FMO*name)などの連番の引数の参照
*が最大値に達するか、引数が存在しなくなるまでの引数を区切の簡易配列で返す。

ちなみにsplitの(S*)はis_emptyで存在判定できない。

例えば、FMOから起動中のゴースト一覧を得るとき。

*
$引数区切り追加	(B5)
:現在デスクトップ上にいるゴーストは「(call,格納関数,FMO,0,name,1,3,、)」だよ。

@格納関数
(nop,
	(set,_count,
		(
			(if,(変数「_count」の存在)==1
				,calc(B5)(_count)+(A3)
				,calc(B5)(A1)+0
			)
		)
	)
	(set,_memory,
		(
			(A0)
			(
				(if,(compare,(A0),FMO)==1
					,zen2han(B5)(_count)
					,han2zen(B5)(_count)
				)
			)
			(A2)
		)
	)
	(set,_result,
		(if,(変数「_result」の存在)==1
			,(_result)
			(if,(変数「_memory」の存在)==1
				,(A5)(_memory)
			)
			,(if,(変数「_memory」の存在)==1
				,(_memory)
			)
		)
	)
)(if,(変数「_memory」の存在)==0,(_result),(if,(_count)>=(A4),(_result)))(nop,
	(set,_memory
		,(if,(_count)>=(A4)
			,set
			,(if,(変数「_memory」の存在)==0
				,set
				,nop
			)
		)
	)
)((if,(compare,(_memory),nop)==1,call,nop)(B5)格納関数(B5)(A0)(B5)(A1)(B5)(A2)(B5)(A3)(B5)(A4)(B5)(A5))((_memory),_count,)((_memory),_result,)

#これでも一行として認識される、即ち「格納関数」の単語数は1つとなる。 
#引数区切にバイト値5を使っているのは趣味です(ぇ

@B5
(sprintf,%c,5)

この時下のように喋る。

現在デスクトップ上にいるゴーストは「ポスト、さくら、ふたば、エミリィ」だよ。

他にも

*installedghostname
$引数区切り追加	(B5)
$インストールされているゴーストの数	(call,格納関数,R,0,,1,99,〓)

@B5
(sprintf,%c,5)

とかでも使える。 このときは(R99)又は引数がなくなるまでまで読み込んで

$インストールされているゴーストの数=さくら〓ふたば〓(略)〓エミリ

みたいになる     ハズ。


リロード   新規 編集 凍結 差分 ファイルUp コピー 名前変更   ホーム 一覧 検索 最終更新 バックアップ   ヘルプ
feed rss feed rdf feed rss20 feed lirs emily4 inside marble note
Last-modified: Tue, 04 Dec 2007 23:01:34 JST (3518d)