始めに

  • ※注意!ここの情報は古いです!「SATORI Mc145-1」よりwhenという内部関数が実装されたのでここの内容は大半が無意味です!実用性はありません!
  • 自分で書いたスクリプトを貼っておくところです。
  • 整備班の最新版の里々+ssu.dllの使用が前提です。偽林檎等には考慮していません。
  • 基本メモなのでバグ率高いです。
  • 何かの参考になったら幸いです。

暫定まとめサイト

里々を120%使い倒すかも知れない場所。(書きかけで力尽きた
http://www5.pf-x.net/~legokichi/nar/satori.html

もくじ

里々での関数製作の基本

  • 里々では内側の括弧の中身から実行される。これは重要。
  • 括弧内の行頭タブと末尾の改行は無視される。行頭半角スペースについては未調査。

括弧で呼び出せるもの。

システム変数について

(R0)

  • ※ローカル変数 SSTPのリクエストに含まれる(Reference0)を簡易的に取得できるようにしたもの。
  • 真偽判定
  • (変数「R0」の存在):存在した場合真
  • (is_empty,(R0)):存在しない場合真
  • (Rの数):リファレンスの総数。1オリジン。

(A0)

call関数で呼び出されたあらゆる対象に対して付く引数。

  • ※プライベート変数
  • (call,hoge)だと(A0)はNull。
  • (is_empty,(A0))で真偽を確かめられる。
  • (hoge)だと(A0)はNotFound。文字列になる。

(S0)

  • ※トーク処理まで保持されるグローバル変数。 SAORIからの返り値。
    (変数「S0」の存在)で真偽を確かめられる。

(H0)

単語の再呼び出し。 (変数「H0」の存在)で真偽を確かめられる?←要検証

関数呼び出し(call)について

replace.txtに

(関数名【タブ】(call,関数名

と書けば関数名だけで呼び出しが可能になる。
だが、callの引数区切りがreplace.txtに書いたモノに固定されてしまうのが難点。
あとは関数内で(replace)を使って括弧展開したときとか。

単語群「SAORI」に書き込んだら?

未検証。
おそらくSAORI呼び出しエラーが出ると思われる。

反則。

replace.txt内

(【タブ】(call,

そんなことをすれば海が汚染されるぞ!

引数区切りについて

里々はデフォルトで「、」「、」「,」「,」「バイト値1」が定義されている。
しかし、全半角文字では文字列処理のときに誤爆するので通常使わない文字が望ましい。
「バイト値1」「バイト値2」はSSTPのヘッダに含まれていることがある。「バイト値3」については覚えていない。
ということで「バイト値4」「バイト値5」に引数区切り。
「バイト値1」「バイト値2」「バイト値3」を簡易配列区切りとしてしまえば誤爆は限りなく避けられる

と考えている。

if

基本

(
	if
	,条件式
	,真の場合表示する文字列
	,偽の場合表示する文字列
)

これを他の一般的なプログラミング言語と混同してはならない。

(
	if
	,(i)==1
	,(set,i,0)
	,(set,i,1)
)

上記のような場合、
まず条件式の変数「i」が展開されて、
次に変数「i」の値が0になり、
さらにに変数「i」の値が1になった上で、
最後にif関数が実行される。
結果、変数「i」は真偽に関わらず必ず1が代入され、
set関数は返り値を持たないためif関数は何も返さない。

if文の評価の後でset関数を使用したい場合下記のように書く必要がある。

(
	(
		if
		,(i)==1
		,set、i、0
		,set、i、1
	)
)

このとき、if関数の引数区切りとset関数の引数区切りを違うものにしなければならない。
なぜなら、if関数とset関数の引数区切りが混同してしまうからである。

しかしこの方法ではif関数の中で実行できる関数は常に1つとなってしまう。
if文のなかで複数の処理をしたい場合は下記のようなことも可能である。

(
	replace
	、(
		replace
		、(
			if
			,(i)==1
			,[set、i、1][set、j、0]
			,[set、i、0][set、j、1]
		)
		、[
		、(han2zen,()
	)
	、]
	、(han2zen,))
)

仮の括弧を後から置換して実行する方法。
複雑なことも出来るが置換処理が割と重いのでお勧めできない。

それよりもこっちを推奨。ばらばらになるけど。

(
	(
		if
		,(i)==1
		,処理1
		,処理2
	)
)
@処理1
(set,i,1)(set,j,0)
@処理2
(set,i,0)(set,j,1)

ループ

for

割と便利。
(ループしたい単語群名カウンタ)で現在のループ回数も分かる。
しかし偽林檎とかだと使えないらしい。

(loop,括弧で呼び出すもの,初期値,終了値,増加量)

@括弧で呼び出すもの
(ループしたい処理)

forの一般形

偽林檎対応?の代用loop関数

(call,for,括弧で呼び出すもの,初期値,終了値,増加量)

@for
(
	(
		unless
		,(変数「(A0)カウンタ」の存在)
		,set
		,nop
	)
	,(A0)カウンタ
	,(A1)
)(
	(A0)
)(
	set
	,(A0)カウンタ
	,(
		calc
		,((A0)カウンタ)+(A3)
	)
)(
	(
		if
		,((A0)カウンタ)<=(A2)
		,call
		,nop
	)
	,for
	,(A0)
	,(A1)
	,(A2)
	,(A3)
)(set,(A0)カウンタ,)

while

条件が成り立つ間、再帰する。

whileの一般形

@while
(
	hoge
)(
	(
		if
		,条件式
		,call
		,nop
	)
	,while
	,付加情報
)

自作関数ライブラリ

動作は保証しかねます。

FizzBuzz

流行ったときに書いてみたやつ。

変数でカウントするタイプ

基本形。

@FizzBuzz
(set,n,
	(if,(変数「n」の存在),(n)+1,1)
)(iflist
	,0==
	,(n)%3+(n)%5
	,FizzBuzz
	,(n)%3
	,Fizz
	,(n)%5
	,Buzz
	,(n)
)\n((if、(n)<100、FizzBuzz、set,n,))

変数を使わないタイプ

制限を大きめにしないと無限ループに陥る。

*OnKeyPress
$呼び出し回数制限	1000
:\_q(call,FizzBuzz,1,100)\_q

@FizzBuzz
(iflist
	,0==
	,(A0)%3+(A0)%5
	,FizzBuzz
	,(A0)%3
	,Fizz
	,(A0)%5
	,Buzz
	,(A0)
)\n(
	(
		if
		,(A0)<(A1)
		,call
		,nop
	)
	,FizzBuzz
	,(calc,(A0)+1)
	,(A1)
)

loop関数を使うタイプ

一番楽。

*OnKeyPress
:\_q(loop,FizzBuzz,1,100)\_q

@FizzBuzz
(iflist
	,0==
	,(FizzBuzzカウンタ)%3+(FizzBuzzカウンタ)%5
	,FizzBuzz
	,(FizzBuzzカウンタ)%3
	,Fizz
	,(FizzBuzzカウンタ)%5
	,Buzz
	,(FizzBuzzカウンタ)
)\n

単語群の内容を簡易配列にして返す

(call,単語配列化,区切り文字列,単語群名)
(call,単語配列化,@,ドラえもん)→ドラえもん@のび太@しずか@ジャイアン@スネ夫@

@単語配列化
(
	set,単語群「(A1)」の重複回避,降順、トーク中
)(
	loop,単語配列化2,(単語群「(A1)」の数)
)
@単語配列化2
((A1))(A0)
@ドラえもん
ドラえもん
のび太
しずか
ジャイアン
スネ夫

リファレンス0から続く限りをバイト値1区切りで返す

(リファレンス全表示)
(リファレンス全表示)→1t8410

@リファレンス全表示
(
	set,引数区切り追加,(sprintf,%c,5)
)(
	call,リファレンス全表示2,0
) (
	set,引数区切り削除,(sprintf,%c,5)
)
@リファレンス全表示2
(
	(if
		、(is_empty(sprintf,%c,5)(R(han2zen,(A0))))
		、A1
		、call
			(sprintf,%c,5)リファレンス全表示2
			(sprintf,%c,5)(calc,(A0)+1)
			(sprintf,%c,5)(A1)(R(han2zen,(A0)))(sprintf,%c,1)
	)
)

現在の季節を表示する

(季節)
(季節)→冬

@季節
(iflist
	,1
	,(現在月)<2,冬
	,(現在月)<4,春
	,(現在月)<7,夏
	,(現在月)<10,秋
	,冬
)

callの引数の数を(強引に)調べる

(call,引数の数,引数1[,引数2[…,引数n]])
(call,引数の数,1,2,3,,,,,8)→8

@引数の数
(set,counter
	,(calc
		,(if
			,(変数「counter」の存在)
			,(counter)
			,-1
		)+1
	)
)(set,result,
	(calc,
		(if
			、(is_empty,(A(counter)))
			、(if,(変数「result」の存在),(result),1)
			、(counter)+1
		)
	)
)(
	(if
		,(counter)<(calc,(result)+5)
		,引数の数
		,result
	)
)(set,counter,)(set,result,)

大根2(OnGetValues)への対応

##
#
# ゴーストの記憶しているキー(ラベル)名付きの変数や定義値を複数、
# SHIORIイベントOnGetValuesで、R1以降に連想配列っぽく格納して返す
# 
# R0:送信元
# R1以降:キー名
# 
# 呼び出しの例
# \![raiseother,(FMO1name),OnRequestValues,(0name),0LIFE,0STR,0DEX,0AGL,0MIN,0INT,0SEN]
# 

*OnRequestValues
\![raiseother,(R0),OnGetValues,(FMO0name)(GetResponseString)]

@GetResponseString
(loop,GetResponseString2,(calc,(Rの数)-1))
@GetResponseString2
(
	if
	(バイト値、1)(単語群「(R(GetResponseString2カウンタ))」の存在)
	(バイト値、1),(R(GetResponseString2カウンタ))=((R(GetResponseString2カウンタ)))
)

大根2(OnRequestValues)への対応。

このように格納する

$key[n]【タブ】key[n]の値~
$value[n]【タブ】value[n]の値~

※普通のゴーストさんには必要のないものです。

##
# 
# OnRequestValuesで要求した連想配列の受け取り
# キー名と値を&で繋いだものをReferenceの1以降に格納する。
# 
# R0:送信元
# R1以降:キー名と値を&で繋いだもの。key=value
# 
*OnGetValues
:\b[2](R0)さんのスキャン結果。
(ResetGetValues)
(SetGetValues)
\_q(ShowGetValues)\_q
(ResetGetValues)


@SetGetValues
(loop,SetGetValues2,(calc,(Rの数)-1))
@SetGetValues2
(
	nop
	,(
		split
		(sprintf,%c,1)(R(SetGetValues2カウンタ))
		(sprintf,%c,1)=
		(sprintf,%c,1)2
	)
)(
	set
	(sprintf,%c,1)key(SetGetValues2カウンタ)
	(sprintf,%c,1)(if(sprintf,%c,1)(変数「S0」の存在)(sprintf,%c,1)(S0))
)(
	set
	(sprintf,%c,1)value(SetGetValues2カウンタ)
	(sprintf,%c,1)(if(sprintf,%c,1)(変数「S1」の存在)(sprintf,%c,1)(S1))
)



@ShowGetValues
(set,n,1)(ShowGetValues2)(set,n,)
@ShowGetValues2
(
	(
		if
		,(変数「key(n)」の存在)
		,key(n)
		,nop、
	)
)\_l[40,](
	(
		if
		,(変数「value(n)」の存在)
		,value(n)
		,nop、
	)
)\n(
	set
	,n
	,(calc,(n)+1)
)(
	(
		if
		,(変数「key(n)」の存在)||(変数「value(n)」の存在)
		,ShowGetValues2
		,nop、
	)
)


@ResetGetValues
(set,n,1)(ResetGetValues2)(set,n,)
@ResetGetValues2
(
	set
	,key(n)
	,
)(
	set
	,value(n)
	,
)(
	set
	,n
	,(calc,(n)+1)
)(
	(
		if
		,(変数「key(n)」の存在)||(変数「value(n)」の存在)
		,ResetGetValues2
		,nop、
	)
)

里々でソート

  • 作りかけ。
  • 最後の数列ソートをどうしていいのか分からない。
  • とりあえず概念だけ書いておく。

replace.txt

【タブ】		
<ー<	(
>ー>	)
*wを押した
$i	
$sortう	
$sortあ	
$sortい	
$sortえ	
$sortお	
(call,sort,う,あ,い,お,え)
@sort
\![raise,OnSatoriSort,(loop,sort2,0,(calc,(引数の数)-1)),(han2zen,<-<)calc(sprintf,%c,1)(erase_first,(loop,sort3,0,(calc,(引数の数)-1)),+)(han2zen,>->)]
@sort2
(A(han2zen,(sort2カウンタ)))(sprintf,%c,1)
@sort3
+(han2zen,<-<)変数「sort(A(han2zen,(sort3カウンタ)))」の存在(han2zen,>->)
@引数の数
(set,counter
	,(calc
		,(if
			,(変数「counter」の存在)
			,(counter)
			,-1
		)+1
	)
)(set,result,
	(calc,
		(if
			、(is_empty,(A(counter)))
			、(if,(変数「result」の存在),(result),1)
			、(counter)+1
		)
	)
)(
	(if
		,(counter)<(calc,(result)+5)
		,引数の数
		,result
	)
)(set,counter,)(set,result,)
*OnSatoriSort
$i【タブ】(calc,(split,(R0),(sprintf,%c,1))-1)
>OnSatoriSort2
*OnSatoriSort2
$sort(S(han2zen,(i)))【タブ】(R1)
>OnSatoriSort3【タブ】(i)==0
$i【タブ】(calc,(i)-1)
>OnSatoriSort2
*OnSatoriSort3
$辞書リロード【タブ】実行
\![raise,OnSatoriSort4,(R0)]

この時点でのセーブデータ

$sortあ	<ー<calc<ー<変数「sortう」の存在>ー>+<ー<変数「sortあ」の存在>ー>+<ー<変数「sortい」の存在>ー>+<ー<変数「sortお」の存在>ー>+<ー<変数「sortえ」の存在>ー>>ー>
$sortい	<ー<calc<ー<変数「sortう」の存在>ー>+<ー<変数「sortあ」の存在>ー>+<ー<変数「sortい」の存在>ー>+<ー<変数「sortお」の存在>ー>+<ー<変数「sortえ」の存在>ー>>ー>
$sortう	<ー<calc<ー<変数「sortう」の存在>ー>+<ー<変数「sortあ」の存在>ー>+<ー<変数「sortい」の存在>ー>+<ー<変数「sortお」の存在>ー>+<ー<変数「sortえ」の存在>ー>>ー>
$sortえ	<ー<calc<ー<変数「sortう」の存在>ー>+<ー<変数「sortあ」の存在>ー>+<ー<変数「sortい」の存在>ー>+<ー<変数「sortお」の存在>ー>+<ー<変数「sortえ」の存在>ー>>ー>
$sortお	<ー<calc<ー<変数「sortう」の存在>ー>+<ー<変数「sortあ」の存在>ー>+<ー<変数「sortい」の存在>ー>+<ー<変数「sortお」の存在>ー>+<ー<変数「sortえ」の存在>ー>>ー>

「辞書リロード」時のれしばのログ

■SATORI::Load on G:\Program\SSP\ghost\scallion2\ghost\master\
本体の所在: G:\Program\SSP\
OS種別: Windows 2000
モニタ: \\.\DISPLAY1 / (0,0,1280,600) / primary
プライマリデスクトップ: (0,0,1280,600)
仮想デスクトップ: (0,0,1280,600)
モニタは一つだけと判断、見切れ判定を呼び出し元に任せます。
  loading satori_conf.txt... ok.
*初期化
  return: \1
  loading satori_savedata.txt... ok.
*セーブデータ
  (変数「sortう」の存在)→0
  (変数「sortあ」の存在)→0
  (変数「sortい」の存在)→0
  (変数「sortお」の存在)→0
  (変数「sortえ」の存在)→0
  (calc0+0+0+0+0)→0
  $sortあ=0/written.
  (変数「sortう」の存在)→0
  (変数「sortあ」の存在)→1
  (変数「sortい」の存在)→0
  (変数「sortお」の存在)→0
  (変数「sortえ」の存在)→0
  (calc0+1+0+0+0)→1
  $sortい=1/written.
  (変数「sortう」の存在)→0
  (変数「sortあ」の存在)→1
  (変数「sortい」の存在)→1
  (変数「sortお」の存在)→0
  (変数「sortえ」の存在)→0
  (calc0+1+1+0+0)→2
  $sortう=2/written.
  (変数「sortう」の存在)→1
  (変数「sortあ」の存在)→1
  (変数「sortい」の存在)→1
  (変数「sortお」の存在)→0
  (変数「sortえ」の存在)→0
  (calc1+1+1+0+0)→3
  $sortえ=3/written.
  (変数「sortう」の存在)→1
  (変数「sortあ」の存在)→1
  (変数「sortい」の存在)→1
  (変数「sortお」の存在)→0
  (変数「sortえ」の存在)→1
  (calc1+1+1+0+1)→4
  $sortお=4/written.

 *OnSatoriSort4 ここで(sortあ)~(sortお)の数の順にならべればソートが成立する。
だがそこをどうすべきかわからない。

里々で配列

保存方法

添え字=対応する値がバイト値3区切りで一つの変数に入っている。

$array○○【タブ】value0(sprintf,%c,3)value1(sprintf,%c,3)value2(sprintf,%c,3)
  • array_set
  • array_get
  • array_dell

これらの関数はこの変数の中身を切った貼ったする。

代入

  • 添え字に対応する値を代入する
    • $hoge[0] = "value0";
(call,array_set,配列名,添え字,対応する値)
#代入
@array_set
(
	call
	,(
		if
		,(変数「array(A0)」の存在)&&(A1)>=0
		,array_set1
		,array_set99
	)
	,(A0)
	,(A1)
	,(A2)
)
@array_set1
(
	call
	,(
		if
		,(count,(array(A0)),(sprintf,%c,3))>(A1)
		,array_set2
		,array_set3
	)
	,(A0)
	,(A1)
	,(A2)
	,0
	,
	,(array(A0))
)
@array_set2
(
	nop
	,(
		split
		,_(A5)_
		,(sprintf,%c,3)
		,2
	)
)(
	call
	,(
		if
		,(A1)==(A3)
		,array_set4
		,array_set2
	)
	,(A0)
	,(A1)
	,(A2)
	,(calc,(A3)+1)
	,(A4)(
		if
		,(A1)==(A3)
		,(A2)
		,(erase_first,(S0),_)
 	)(sprintf,%c,3)
	,(reverse,(erase_first,(reverse,(S1)),_))
)
@array_set3
(
	set
	,array(A0)
	,(array(A0))(
		loop
		,sprintf、%c、3
		,(calc,(A1)-(count,(array(A0)),(sprintf,%c,3)))
	)(A2)(sprintf,%c,3)
)
@array_set4
(
	set
	,array(A0)
	,(A4)(reverse,(erase_first,(reverse,(S1)),_))
)
@array_set99
(
	set
	,array(A0)
	,(
		loop
		,sprintf、%c、3
		,(A1)
	)(A2)(sprintf,%c,3)
)

取得

  • 添え字に対応する値を取得する
    • print $hoge[0];
(call,array_get,配列名,添え字)
#取得
@array_get
(
	(
		if
		,(変数「array(A0)」の存在)
		,call
		,nop
	)
	,array_get1
	,(A0)
	,(A1)
	,0
	,(array(A0))
)
@array_get1
(
	nop
	,(
		split
		,_(A3)_
		,(sprintf,%c,3)
		,2
	)
)(
	call
	,(
		if
		,(A1)==(A2)
		,array_get2
		,array_get1
	)
	,(A0)
	,(A1)
	,(calc,(A2)+1)
	,(reverse,(erase_first,(reverse,(S1)),_))
)
@array_get2
(erase_first,(S0),_)

削除

  • 添え字とその値を削除
    • undef $hoge[0];
(call,array_del,配列名,添え字)
  • 配列全てを削除
    • undef @hoge;
(call,array_del,配列名)
#削除
@array_del
(
	call
	,(
		if
		,(is_empty,(A1))
		,array_del99
		,array_del1
	)
	,(A0)
	,(A1)
)
@array_del1
(call,array_set,Value,(A1),)
@array_del99
(set,array(A0),)

里々で連想配列

保存方法

key=valueがバイト値3区切りで一つの変数に入っている。

$hash○○【タブ】key0=value0(sprintf,%c,3)key1=value1(sprintf,%c,3)key2=value2(sprintf,%c,3)
  • hash_set
  • hash_get
  • hash_dell

これらの関数はこの変数の中身を切った貼ったする。

代入

  • キーに対応する値を代入する
    • $hoge{'key'} = "value";
(call,hash_set,連想配列名,キー,対応する値)
#代入
@hash_set
(
	call
	,hash_set(
		if
		,(変数「hash(A0)」の存在)
		,1
		,99
	)
	,(A0)
	,(A1)
	,(A2)
)
@hash_set1
(
	nop
	,(
		split
		,(hash(A0))
		,(sprintf,%c,3)
	)
)(
	call
	,hash_set2
	,(A0)
	,(A1)
	,(A2)
	,0
)
@hash_set2
(
	call
	,hash_set(
		if
		,(変数「S(han2zen,(A3))」の存在)
		,(
			if
			,(
				compare_head
				,(S(han2zen,(A3)))
				,(A1)
			)
			,3
			,2
		)
		,98
	)
	,(A0)
	,(A1)
	,(A2)
	,(calc,(A3)+1)
)
@hash_set3
(
	set
	,hash(A0)
	,(
		replace
		,(hash(A0))
		,(
			if
			,(
				split
				,(S(han2zen,(calc,(A3)-1)))
				,=
				,2
			)==2
			,(S0)=(S1)
			,(S0)=
		)
		,(S0)=(A2)
	)
)
@hash_set98
(
	set
	,hash(A0)
	,(hash(A0))(A1)=(A2)(sprintf,%c,3)
)
@hash_set99
(
	set
	,hash(A0)
	,(A1)=(A2)(sprintf,%c,3)
)

取得

  • キーに対応する値を取得する
    • print $hoge{'key'};
(call,hash_get,連想配列名,キー)
#取得
@hash_get
(
	(
		if
		,(変数「hash(A0)」の存在)
		,call
		,nop
	)
	,hash_get1
	,(A0)
	,(A1)
)
@hash_get1
(
	nop
	,(split,(hash(A0))
	,(sprintf,%c,3)
	)
)(
	call
	,hash_get2
	,(A0)
	,(A1)
	,0
)
@hash_get2
(
	(
		if
		,(変数「S(han2zen,(A2))」の存在)
		,call
		,nop
	)
	,hash_get(
		if
		,(
			compare_head
			,(S(han2zen,(A2)))
			,(A1)
		)
		,3
		,2
	)
	,(A0)
	,(A1)
	,(calc,(A2)+1)
)
@hash_get3
(
	if
	,(
		split
		,(S(han2zen,(calc,(A2)-1)))
		,=
		,2
	)==2
	,(S1)
)

削除

  • キーとその値を削除
    • undef $hoge{'key'};
(call,hash_del,連想配列名,キー2)
  • 連想配列全てを削除
    • undef %hoge;
(call,hash_del,連想配列名)
#削除
@hash_del
(
	call
	,hash_del(
		if
		,(is_empty,(A1))
		,99
		,1
	)
	,(A0)
	,(A1)
)
@hash_del1
(
	nop
	,(
		split
		,(hash(A0))
		,(sprintf,%c,3)
	)
)(
	call
	,hash_del2
	,(A0)
	,(A1)
	,(A2)
	,0
)
@hash_del2
(
	(
		if
		,(変数「S(han2zen,(A3))」の存在)
		,call
		,nop
	)
	,hash_del(
		if
		,(compare_head,(S(han2zen,(A3))),(A1))
		,3
		,2
	)
	,(A0)
	,(A1)
	,(A2)
	,(calc,(A3)+1)
)
@hash_del3
(
	set
	,hash(A0)
	,(
		erase
		,(hash(A0))
		,(S(han2zen,(calc,(A3)-1)))
	)
)
@hash_del99
(set,hash(A0),)

replace_end

replaceの一番最後の該当文字だけ置き換える版を自作してみた。

(call,replace_end,文字列,検索語,置換する語)
@replace_end
(
	reverse
	,(
		replace_first
		,(reverse,(A0))
		,(reverse,(A1))
		,(reverse,(A2))
	)
)

erase_end

eraseの一番最後の該当文字だけ削除する版を自作してみた。

(call,erase_end,文字列,削除する語)
@erase_end
(
	reverse
	,(
		erase_first
		,(reverse,(A0))
		,(reverse,(A1))
	)
)

split_end

splitのうしろから切っていく版を自作してみた。

(call,split_end,文字列,[分割文字列,[最大分割数]])
@split_end
(
	split
	,(reverse,(A0))
	,(reverse,(A1))
	,(A2)
)
(reverse,(S0))

仕様上、返り値が反転してしまうので元に戻すこと。

ファイル名取得

(call,ファイル名取得,ファイルパス)
@ファイル名取得
(
	nop
	,(
		split
		,(reverse,(A0))
		,\
		,2
	)(
		split
		,(S0)
		,/
		,2
	)
)(reverse,(S0))

拡張子取得

(call,拡張子取得,ファイルパスorファイル名)
@拡張子取得
(
	nop
	,(
		split
		(バイト値,1)(reverse,(A0))
		(バイト値,1).
		(バイト値,1)2
	)
)(reverse(バイト値,1)(S0))

タグ消し

(call,タグ消し,文字列,初めの部分,終わりの部分)
*htmlのタグ消去
(call(バイト値、1)タグ消し(バイト値、1)(HTML)(バイト値、1)<(バイト値、1)>)

@タグ消し
(
	call
	(バイト値、1)(
		if
		,(count(バイト値、1)(A0)(バイト値、1)(A1))>1
		,タグ消し
		,タグ消し1
	)(バイト値、1)(
		nop
		,(
			split
			(バイト値、1)(バイト値、3)(A0)
			(バイト値、1)(A1)
			(バイト値、1)2
		)
	)(S0)(
		nop
		,(
			split
			(バイト値、1)(S1)(バイト値、3)
			(バイト値、1)(A2)
			(バイト値、1)2
		)
	)(S1)
	(バイト値、1)(A1)
	(バイト値、1)(A2)
)
@タグ消し1
(
	erase
	(バイト値、1)(A0)
	(バイト値、1)(バイト値、3)
)

里々で人工無脳みたいなことをする

  • 駄でべろぱの小ネタWikiへようこそ。要するに駄ネタ大歓迎、気軽なネタWiki……ということで、アホなネタをそれとなく仕込んで見た人を吹かせるのを推奨します。
    • 生成文例1:人をネタをそれとなく駄ネタ大歓迎、仕込んでアホな駄でべろぱの推奨します。
    • 生成文例2:アホな気軽な駄ネタ大歓迎、気軽な仕込んで人を小ネタWikiへようこそ。
    • 生成文例3:見た仕込んでネタWiki……ということで、ネタをそれとなくアホな人を推奨します。
    • 生成文例4:仕込んで見た駄ネタ大歓迎、ネタをそれとなく要するに人を小ネタWikiへようこそ。
  • しくみ
    • [ひらがな以外][ひらがな]
    • [文字]、
    • [文字]。
      • この三つのパターンを並び替えているだけです。
      • 文節の入れ替えが容易な日本語の特徴を利用している。
*
$文章	駄でべろぱの小ネタWikiへようこそ。要するに駄ネタ大歓迎、気軽なネタWiki……ということで、アホなネタをそれとなく仕込んで見た人を吹かせるのを推奨します。
$カタカナ	アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヰヱヲンァィゥェォャュョヮッガギグゲゴザジズゼゾダヂヅデドバビブベボパピプペポ
$ひらがな	あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわゐゑをんぁぃぅぇぉゃゅょゎっがぎぐげござじずぜぞだぢづでどばびぶべぼぱぴぷぺぽ
$句読点	。。
$句点	、、
$単語群「文のエレメント」の重複回避	トーク中
(追加単語の全削除、文のエレメント)(追加単語の全削除、文のラストエレメント)
(loop,何か,(length,(文章)))
(文のエレメント)(文のエレメント)(文のネクストエレメント)
(文のエレメント)(文のエレメント)(文のエレメント)(文のラストエレメント)

@何か
(
	set
	,文字
	,(han2zen,(substr,(文章),(何かカウンタ)-1,1))
)(
	(
		iflist
		,0!=
		,(count,(句読点),(文字))
		,文のラストエレメント確定
		,(count,(句点),(文字))
		,文のネクストエレメント確定
		,(is_digit,(文字))
		,ファーストフラグエレメント判定
		,(is_alpha,(文字))
		,ファーストフラグエレメント判定
		,(count,(カタカナ),(文字))
		,ファーストフラグエレメント判定
		,(count,(ひらがな),(文字))
		,エレメント
		,ファーストフラグエレメント判定
	)
)(
	set
	,一つ前の文字
	,(文字)
)
@ファーストフラグエレメント判定
(
	(
		if
		,0!=(count,(ひらがな),(一つ前の文字))
		,文のエレメント確定
		,フラグエレメント
	)
)
@フラグエレメント
(
	set
	,文節
	,(if,(変数「文節」の存在),(文節))(文字)
)
@エレメント
(
	set
	,文節
	,(if,(変数「文節」の存在),(文節))(文字)
)
@文のエレメント確定
(
	単語の追加
	,文のエレメント
	,(if,(変数「文節」の存在),(文節))
)(
	set
	,文節
	,(文字)
)
@文のラストエレメント確定
(
	単語の追加
	,文のラストエレメント
	,(if,(変数「文節」の存在),(文節))(文字)
)(
	set
	,文節
	,
)
@文のネクストエレメント確定
(
	単語の追加
	,文のネクストエレメント
	,(if,(変数「文節」の存在),(文節))(文字)
)(
	set
	,文節
	,
)

(合成単語群)

(call,合成単語群,[単語群名],...)
:野菜と言えば(野菜)。
肉と言えば(肉)。

でも、私の一番の好物は(食べ物)!

@野菜
たまねぎ
ながねぎ
しらがねぎ
万能ねぎ
青ねぎ
しろねぎ

@肉
鶏肉
鴨肉
家鴨肉

@食べ物
(call,合成単語群,野菜,肉)

@合成単語群
(
	S(
		乱数1~
		(
			split
			,(
				loop
				,call、合成単語群3(loop,合成単語群2,(Aの数))
				,(Aの数)
			)
			,(バイト値、1)
		)
	)
)
@合成単語群2
、(A(合成単語群2カウンタ))

@合成単語群3
(call,単語配列化,(バイト値,1),(A(合成単語群3カウンタ)))


@単語配列化
(
	set,単語群「(A1)」の重複回避,降順、トーク中
)(
	loop,単語配列化2,(単語群「(A1)」の数)
)

@単語配列化2
((A1))(A0)

文字を2分割する

$文字列【タブ】あいうえおかきくけこ
前半φ:(substr,(文字列),0,(length,(文字列))/2) 
後半φ:(substr,(文字列),(length,(文字列))/2,(length,(文字列))) 

危険なSakuraScriptタグを無効化する。

(call(バイト値、1)KillDangerousTag(バイト値、1)[SakuraScript])→[危険なタグを表示無効化するように変換されたSakuraScript]
@KillDangerousTag
(
	set
	,単語群「DangerousTag」の重複回避
	,降順、トーク中
)(
	set
	,n
	,(単語群「DangerousTag」の数)
)(
	set
	,引数区切り追加
	,(バイト値、2)
)(
	call
	(バイト値、1)KillDangerousTag2
	(バイト値、1)(A0)
)(
	set
	,SaveDangerousTag
	,
)(
	set
	,n
	,
)(
	set
	,引数区切り削除
	,(バイト値、2)
)

@KillDangerousTag2
(
	set
	,n
	,(calc,(n)-1)
)(
	set
	(バイト値、1)SaveDangerousTag
	(バイト値、1)(DangerousTag)
)(
	(
		unless
		(バイト値、1)(n)==-1
		(バイト値、1)
			call
			(バイト値、2)KillDangerousTag2
			(バイト値、2)(
				replace
				(バイト値、1)(A0)
				(バイト値、1)(SaveDangerousTag)
				(バイト値、1)\(SaveDangerousTag)
			)
		(バイト値、1)A0
	)
)

@DangerousTag#	危険なタグリスト
\![updatebymyself]
\![vanishbymyself]
\![raise
\![open,browser
\![open,mailer
\![execute,http
\![enter,passive
\![enter,induction
\![enter,passivemode]
\![leave,passivemode]
\![lock,repaint]
\![unlock,repaint]
\![biff]
\j[
#以下自由に追加可能

物理エンジンみたいな何か

  • 机上の空論です。動かしたことありません。
  • 放物線を描いたりとかするかもしれません。
    *
    (設定)
    
    *OnDisplayChange
    $xMax【タブ】(R1)
    $yMax【タブ】(R2)
    
    *設定
    $θ【タブ】45
    $F【タブ】10
    $m【タブ】1
    $g【タブ】-9.8
    $dt【タブ】1
    $e【タブ】0.8
    $dv→【タブ】(aya,sqrt,(aya,eval,2*(F)/(m)))
    $dvx【タブ】(aya,eval,(dv→)*(aya,cos,(θ)))
    $dvy【タブ】(aya,eval,(dv→)*(aya,sin,(θ)))
    >落下
    
    *落下
    $dx【タブ】(aya,eval,(dvx)*(dt))
    $dvy【タブ】(aya,eval,(dvy)+((g)/2)*(dt))
    $dy【タブ】(aya,eval,(dvy)*(dt))
    $x【タブ】(aya,eval,(dx)+(x))
    $y【タブ】(aya,eval,(dy)+(y)*-1)
    >衝突x【タブ】(x)<0||(xMax)<(x)
    >衝突y【タブ】(y)<0||(yMax)<(y)
    \![move,(x),(y),(dt),screen,left.top,center.center]
    \![rasie,落下]
    
    *衝突x
    $dvx【タブ】(aya,eval,(e)*(dvx)*-1)
    >落下
    
    *衝突y
    $dvx【タブ】(aya,eval,(e)*(dvy)*-1)
    >落下

SakuraScript除去

$引数区切り追加【タブ】(バイト値、5)
(call(バイト値、5)サクラスクリプト除去(バイト値、5)[SakuraScript])
$引数区切り削除【タブ】(バイト値、5)
@サクラスクリプト除去
(
	set,引数区切り追加,(バイト値、5)
)(
	set(バイト値、5)サクラスクリプト除去変数(バイト値、5)(A0)
)(
	set,単語群「SakuraScriptList」の重複回避,正順、トーク中
)(
	set,単語群「SakuraScriptList2」の重複回避,正順、トーク中
)(
	サクラスクリプト除去1
)(
	set,サクラスクリプト除去変数,
)(
	set,サクラスクリプト除去済変数,
)(
	set,消すべきSakuraScript,
)(
	set,引数区切り削除,(バイト値、5)
)

@サクラスクリプト除去1#一文字目調べる
(
	(
		iflist
		,1==
		,(
			compare_head
			(バイト値、5)(サクラスクリプト除去変数)
			(バイト値、5)\\
		)
		,サクラスクリプト除去6
		,(
			compare_head
			(バイト値、5)(サクラスクリプト除去変数)
			(バイト値、5)\
		)
		,サクラスクリプト除去3
		,nop、
	)
)(
	サクラスクリプト除去2
)(
	(
		if
		,(変数「サクラスクリプト除去変数」の存在)
		,サクラスクリプト除去1
		,(
			if
			,(変数「サクラスクリプト除去済変数」の存在)
			,サクラスクリプト除去済変数
			,nop、
		)
	)
)

@サクラスクリプト除去2#一文字削除
(
	set
	(バイト値、5)サクラスクリプト除去済変数
	(バイト値、5)(
		(
			if
			,(変数「サクラスクリプト除去済変数」の存在)
			,サクラスクリプト除去済変数
			,nop、
		)
	)(
		substr
		(バイト値、5)(
			(
				if
				,(変数「サクラスクリプト除去変数」の存在)
				,サクラスクリプト除去変数
				,nop、
			)
		)
		(バイト値、5)0
		(バイト値、5)1
	)
)(
	set
	(バイト値、5)サクラスクリプト除去変数
	(バイト値、5)(
		erase_first
		(バイト値、5)(
			(
				if
				,(変数「サクラスクリプト除去変数」の存在)
				,サクラスクリプト除去変数
				,nop、
			)
		)
		(バイト値、5)(
			substr
			(バイト値、5)(
				(
					if
					,(変数「サクラスクリプト除去変数」の存在)
					,サクラスクリプト除去変数
					,nop、
				)
			)
			(バイト値、5)0
			(バイト値、5)1
		)
	)
)

@サクラスクリプト除去3#一番初めが\だった
(
	loop
	,サクラスクリプト除去4
	,(単語群「SakuraScriptList」の数)
)(
	loop
	,サクラスクリプト除去5
	,(単語群「SakuraScriptList2」の数)
)

@サクラスクリプト除去4#サクラスクリプト削除
(
	set
	(バイト値、5)サクラスクリプト除去変数
	(バイト値、5)(
		erase_first
		(バイト値、5)(サクラスクリプト除去変数)
		(バイト値、5)(SakuraScriptList)
	)
)

@サクラスクリプト除去5#\*[の探索
(
	set
	,削除すべきSakuraScript
	,(SakuraScriptList2)
)(
	(
		if
		,(
			compare_head
			(バイト値、5)(サクラスクリプト除去変数)
			(バイト値、5)(削除すべきSakuraScript)
		)
		,サクラスクリプト除去7
		,nop、
	)
)

@サクラスクリプト除去6#一番初めが\\だった
(
	set
	(バイト値、5)サクラスクリプト除去済変数
	(バイト値、5)(
		(
			if
			,(変数「サクラスクリプト除去済変数」の存在)
			,サクラスクリプト除去済変数
			,nop、
		)
	)(
		substr
		(バイト値、5)(サクラスクリプト除去変数)
		(バイト値、5)0
		(バイト値、5)2
	)
)(
	set
	(バイト値、5)サクラスクリプト除去変数
	(バイト値、5)(
		erase_first
		(バイト値、5)(サクラスクリプト除去変数)
		(バイト値、5)(
			substr
			(バイト値、5)(サクラスクリプト除去変数)
			(バイト値、5)0
			(バイト値、5)2
		)
	)
)
@サクラスクリプト除去7#\*[の削除
(
	set
	(バイト値、5)サクラスクリプト除去変数
	(バイト値、5)(
		erase_first
		(バイト値、5)(サクラスクリプト除去変数)
		(バイト値、5)(削除すべきSakuraScript)
	)
)(サクラスクリプト除去8)

@サクラスクリプト除去8#]までの削除
(
	(
		if
		,(
			compare_head
			(バイト値、5)(サクラスクリプト除去変数)
			(バイト値、5)]
		)(サクラスクリプト除去9)
		,nop、
		,サクラスクリプト除去8
	)
)

@サクラスクリプト除去9#]の削除
(
			set
			(バイト値、5)サクラスクリプト除去変数
			(バイト値、5)(
				erase_first
				(バイト値、5)(サクラスクリプト除去変数)
				(バイト値、5)(
					substr
					(バイト値、5)(サクラスクリプト除去変数)
					(バイト値、5)0
					(バイト値、5)1
				)
			)
		)

@SakuraScriptList
\0
\1
\h
\u
\s0
\s1
\s2
\s3
\s4
\s5
\s6
\s7
\s8
\s9
\n
\_n 
\c
\C
\_!
\_?
\w1
\w2
\w3
\w4
\w5
\w6
\w7
\w8
\w9
\x
\t
\_q
\_s
\z
\*
\e
\-
\4
\5
\6
\7
\+
\_+
\v
\_V
\__t 

@SakuraScriptList2
\p[
\s[
\i[
\![
\__w[
\b[
\_b[
\n[
\c[	
\_l[
\f[
\_w[
\__w[
\x[
\_s[
\q[
\__q[
\_a[
\8[
\_v[
\j[
\_u[
\_m[
\&[
\m[

その他小技

Tipsともいう

OnUserInputの空打ちとOnUserInputCancelの実装

*OnUserInput
>(R0)をタイムアウト【タブ】(compare,(R1),timeout)
>(R0)を空打ちされた【タブ】(is_empty,(R1))
$(R0)【タブ】(R1)
>(R0)を教えてもらった
*OnUserInputCancel
>(R0)を空打ちされた【タブ】(compare,(R1),close)

ユーザ情報の取得

*OnNotifyUserInfo
$ユーザ名【タブ】(R0)
$フルネーム【タブ】(R1)
$誕生日【タブ】(nop,(split(R2),))(S0)年(S1)月(S2)日

ランダムトークを音で知らせる

*OnTalk 
>(R1)【タブ】(R0) 
\_v[hoge.wav] ()

里々で改行を扱う

LF(sprintf,%c,10)
CR(sprintf,%c,13)
CRLF(sprintf,%c,13)(sprintf,%c,10)

別人格

+-master\
  +-template\
    +-another\
      +-dic*.txt
  +-satori.dll
  +-satori_conf.txt
$辞書フォルダ【タブ】template\another

実は深い階層のフォルダの辞書も読み込める。

dsaudio.dllの使い方

マウスホイールによる音量調節

*OnMouseWheel
(
	(
		if
		,(変数「ボリューム」の存在)
		,nop
		,set
	)
	,ボリューム
	,5000
)(
	set
	,ボリューム
	,(
		iflist
		,1==
		,(calc,(ボリューム)+((R2)))>10000
		,10000
		,0>(calc,(ボリューム)+((R2)))
		,0
		,(calc,(ボリューム)+((R2)))
	)
)(
	volume
	,(ボリューム)
):音量φ:(ボリューム)

httpc.dllでLingrのログを取得

$URL	http://c-kom.homeip.net/lingrtext/url/http://www.lingr.com/room/jyW4aiX5YOC/
$番号	5
$HTML	(httpc(バイト値、1)(URL)(バイト値、1)</a><br /><hr />(バイト値、1) <hr /><a href=")
$HTML	(replace(バイト値、1)(HTML)(バイト値、1)<br />(バイト値、1)(バイト値、3))
$引数区切り追加	(バイト値、3)
(nswitch(バイト値、3)(番号)(バイト値、3)(HTML))
$引数区切り削除	(バイト値、3)

LingrAPIを使う版

  • 誰かUTF-8デコーダ作ってorz
    $api_key	XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    $id	jyW4aiX5YOC
    $session	(call,Fsession,(api_key))
    $ticket	(call,Fticket,(session),(id))
    $counter	(call,Fcounter,(session),(id))
    $message	(call,Fmessage,(session),(id),(ticket),(counter))
    $destroy	(call,Fdestroy,(session))
    
    (S(calc,(Sの数)-1))#最新のレス
    
    @Fsession
    (
    	httpc
    	,http://www.lingr.com/api/session/create
    	?api_key=(A0)
    	,<session>
    	,</session>
    )
    
    @Fticket
    (
    	httpc
    	,http://www.lingr.com/api/room/enter
    	?session=(A0)
    	&id=(A1)
    	,<ticket>
    	,</ticket>
    )
    
    @Fcounter
    (
    	httpc
    	,http://www.lingr.com/api/room/enter
    	?session=(A0)
    	&id=(A1)
    	,<counter>
    	,</counter>
    )
    
    @Fmessage
    (
    	httpc
    	,http://www.lingr.com/api/room/observe
    	?session=(A0)
    	&id=(A1)
    	&ticket=(A2)
    	&counter=(A3)
    	,<message>
    	,</message>
    )
    
    @Fdestroy
    (
    	httpc,
    	http://www.lingr.com/api/session/destroy
    	?session=(A0)
    	,<status>
    	,</status>
    )
    

urlencode.dllを使ってCGIにSHIORIリクエストを投げる。

(送信)

@送信
\![execute,http-get,(CGI)?(SSTP)]#←スクリプト版。
#\![open,browser,(CGI)?(SSTP)]#←ブラウザオープン版。

@CGI
http://www5.pf-x.net/~legokichi/cgi-bin/kokage/kokage.cgi

@SSTP
(
	replace
	,(
		urlencode
		,
NOTIFY SSTP/1.1	
Sender: (Sender)	
Event: (ID)	
(Reference*)
Charset: (Charset)
	)
	,%09
	,&
)

@Reference*
(loop,Reference**,0,(calc,(Rの数)-1))

@Reference**
(unless,(is_empty,(R(Reference**カウンタ))),Reference(Reference**カウンタ): (R(Reference**カウンタ))	)

こめんと

  • 関数まとめというよりも里々まとめに近くなってきた。分離したほうがいいかも。 -- レゴキチ 2007-11-28 (水) 01:24:24
  • 警告文つけといたけどでけぇw -- レゴキチ 2009-02-12 (木) 00:48:20


トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-02-12 (木) 13:37:22