簡単オリジナル言語作成ver2014/02/26

久しぶりにやりました
前のverが13/4なので ほぼ一年ぶりW
13/4頃も一年ぶりに再開させたかんじなので
作成期間2年で全然進んでないダメっぷりw

そうさなぁ
りささんとこのBBSに言語作成の本読んでますって
書いたの5年くらい前っぽかったりします

オリジナル言語作成はストップしてましたが
Rubyで作る奇妙なプログラミング言語」の簡易言語を写経したり
HSPに移植したりはしてました
2013/6頃から写経始めたみたいです
ってこっちもサボりサボリではあるんですが

今日はラベルに関していじってました
ラベル文読み込みとJUMPニーモニック追加
読めるだけで動き方設定してないのですが

ラベルはラベル定義があるだけじゃダメで
JUMPのp1定義もした方がいいみたい
ラベルと飛ぶ前の場所を二つとも管理すると良さげですね
って書籍の簡単言語がそんなかんじなんです

書籍とかに載ってる言語を自分なりに改造するっていいかも
テンプレートとして
自由にやった方がいいようで
テンプレートは欲しいですよね
それか 僕に全部自力で実装する能力がないか
って全部自力で実装できるやつなんているんか?W
しかも全部車輪の再発明

gitちょっとWEBで勉強して
githubはまだ全然わかんないんですがw
subversionもちょっとやってみて
結局@wikiで管理することにしました
しばらく一人開発なんだろーなー
最後まで一人開発かもしれへんw

LISPっぽく

LISPではcarとcdrが重要みたいです
なんで重要かという問いに対する仮説を立ててみましょう

最初の引数は処理の名前なんです
Cで言う関数の名前
cdrは引数
関数と引数を取得するキーワードcarとcdr
関数名はcarじゃなく()の外側に書いとけ!って
そうじゃないんですよね
って論理 変かもしれないですが

ってことはHSPでも
f(+ p1 p2)
f(- p1 p2)
とか定義するのは動くのか?というのもあります

逆演算

問題解決の書籍の中で
論理を逆にするという解決策を紹介していました
コレ何気に重宝しますね

例えばintを16進表記の文字列に変換するという処理があるなら
当然16進表記の文字列をintに変換する処理が必要になることが考えられるんです

進めて、したい処理と同じ処理をNETで見つけた
しかしその処理の中の論理演算が
自分の求める論理演算と異なるとか

ソートとかたくさんの人がしたい論理演算が異なるので
似て非なる処理の痕跡はいっぱいあるんでしょうし
それならプログラムの作業はずっと求められるのでしょうね

LIFO 後入先出法 の亜種として

僕がよくmesboxで使う技なんですが

先からデータを入れていって 64kb越えると
後ろのデータから消えていくんです
mesboxなんで データを先から入れないと最新のを表示できないからなんですが^^;

でもそういうデータ構造って良くない?w

logmesのデータ管理もそうして欲しいです。とかw
一定の量越えると動かなくなりますし
logmesに限らず 簡易ログ管理として良さそうです
後はテキスト表示とか
テキスト表示は64k以前のテキストなんてほぼいらないし
logmesでもほぼいらないんですが

という訳で思考実験

まず64kbの文字列のなんか(入れるの)用意

まずは前から後ろに向けてデータ格納し続ける

一番後ろに着たら データの挿入先を一番前に変更

後ろに向けてデータを挿入し続ける

うーんw

2byte文字むかつくw

後ろから前に変更したら

最初の文字は更新前の残りですよね

それが2byte文字だったらw 全部文字化けやんw

案B


まず64kbの文字列のなんか(入れるの)用意

最初の先頭を32kbめとする

256*128byte目を先頭の位置として変数に入れる

表示用文字列は256*128byte→256*256byte-1→0→256*128byte-1

追加文字列を渡す

文字列の長さを取得
256*128byte-strlen(文字列)+1 から文字列挿入

先頭用変数に256*128byte-strlen(文字列)+1代入

表示用文字列は256*128byte-strlen(文字列)+1→256*128byte→256*256byte-1→0→256*128byte-strlen(文字列)+1

文字列が途中で途切れる対策が立てばこれでいけるかも

グルグル回ることが不安なら次の方法

案C

まず64kbの文字列のなんか(入れるの)用意
先頭から文字列代入

次は hoge=_2input+hoge

代入先=次の挿入+前の代入先

みたいなw

代入にmaxsizeを計算してその辺で区切るの必要です

コピーの計算かかるけど考え方が楽でいい

案D

案Bの方式を

64kB/4くらいでデータ用意

そこへ表示用文字列を入れてから表示

だってデータ途中で切れるんだもんw

64kb表示したいなら256kbくらい用意しましょう

4倍くらいってのは勘ですw

なんか「先入れ先出し(FIFO)」っぽさがw

案C の改良

HSPでもそうなんですけど
文字列追加してったらサイズ大きくなってかない?

なので適当なタイミングで
新しく文字列をこさえて
64kbでカットしてコピー

文字列カットモジュール書きました
http://seesaawiki.jp/modu_zazann/d/HSP_2014_split_str.hsp

大きな記憶と小さな記憶

ここで言う記憶とはPCにおけるデータです

大きな記憶
メモリもHDDもCDも
小さな記憶が並んだ羅列だ

プログラムは最初一列に並んだデータを読み出す
記憶するなら一列に並べて保存する

小さな記憶
変数とかmallocとか
いつからか小さな記憶も得意になった

並んだ記憶 配列も 大きさは可変になってきた

プログラムは一列に並んでる
構造体を使えば
要素がsize固定なら
構造体の配列もまた一列に並んでいる

今日はnibble単位でいじってました
nibble単位なのにsizeが4byteなんですが
モジュール変数になってますが
コレ構造体だったら一列に並んでるなぁって
保存形式用なので
保存する時は一列になって暗号かけて保存する予定

なんか単純な話なのに 話がじょじょに大きくなってゆくーw
http://seesaawiki.jp/modu_zazann/d/HSP_2014_step_ar_sub01.hsp

二ついっぺんに置き換え

色々考えたんですけど
てか なんとなく考えてたんですけど
プログラマがプログラムに書く 区切り文字
もしくは 拾う文字
TOOLで拾うために調べて目印にする文字

大体 プログラムってのは それようの
好きにして下さいーって文字みあたらない

文字列の中とか コメントの中とかもあるし
ってか文字列にするとしても
したらコメントか文字列の中に書きたくなる気がします

でも組み合わせると 割といけるんちゃうんかな?って

$# とか
$% とか

で僕が考えたのが
[*]もしくは[*hoge]と
[|*]もしくは[|*hoge]

が文字列の中で言う¥ね

hogeには好きな文字入れなされ

そんなこと 前書いたっけ?

でも今はコレ決定気味です

で置き換えモジュール書きました
http://seesaawiki.jp/modu_zazann/d/HSP_2014_two_rep.hsp

元のモジュールは 開発wiki から拾ってきたので
動作がわかりにくくて苦労しました
割と簡単な置き換えモジュール使用したんだけどな

一文字目[で2文字目が|だと3文字目が2文字目になって
一文字目[で2文字目が|で3文字目が|だと3文字目削除
って仕様もいいかも今なら割と楽に出来そう
Perlの¥ってそんなかんじゃなかったでしたっけ?