難解プログラミング言語です。 Dynamic Line Numbering LanguageでDLNLです。 ・2文字以上の予約語はクオーテーションで囲む(bnfの<>で囲むことのリスペクト) ・クオーテーションが2つ連続するとき、ダブルクオーテーションで代替可能(INTERCALで'と.を合体して!と書けることのリスペクト) ・半角スペースは無視 ・"\"でエスケープ(\sは半角スペース) ・","で区切り ・":"の前が行番号 ・";"が文の区切り ・逆ポーランド記法 ・行番号は動的な値(スタックの最初)を取り、その時点で前に実行したものより大きいもののうち最小のものを実行(最初は0,同じ場合は先にあるものから)、終了したいときはそのような行番号をなくせばよい ・行番号は、前にないときに省略するとコードidになる(?) ・行番号のスタックは、最終実行行番号+1で初期化(???) ・行番号以外のスタックは出力される ・変数は宣言した行が名前になる ・予約語一覧 ・行番号以外で未定義の変数にアクセスできないが、行番号の場合は、その行は実行されない "+","-","*","/","%" : 二項演算子 "@" : ":"か";"か"!"か">"に当たるまでその後を無視 "^" : e^xを計算(単項) "rt" : 平方根 "ln" : 自然対数 "|" : 四捨五入 "+|" : 切り上げ "-|" : 切り捨て "&" : 文字列結合(2項) "?" : (Scratchで)0より大きいときは1をでなければ0を返す "$" : レジスタ間接 "!" : 引数を初期値として変数宣言(行番号内だと使えない),";"の役割も兼ねる "_" : 文字列の長さ "in" : 文字列が含まれるか "#" : 文字列の指定文字目(1から) "=" : 代入(行番号内だと使えない) ">" : falseなら停止,";"の役割も兼ねる "<" : 入力 "==" : 等号 "+=" : += "++","--" : インクリメント、デクリメント "~" : falsyなら1を、truthyなら0を返す おそらく(弱)チューリング完全
Scratchだと実行速度はとてつもなく遅いです。 https://turbowarp.org/1157123667?clones=Infinity&fps=1&turbo Hello, world! (2s over) Hello\,\sworld\! 入力された2数の足し算 <<+ 1~10まで (22s over) 1!:1$1'++'1$12-> FizzBuzz 100まで (756s over) 1!0!0!0!4$*:1'++'2,1$3%~=3,1$5%~=4,0=1$101->;2$*3$*:FizzBuzz,4,1=;2$*:Fizz,4,1=;3$*:Buzz,4,1=;:1$4,1= Brainf*ckインタプリタを実装する際参考にすること ・どこかの変数をプログラムカウンタにして実行のたびに1ずつ進めます。 ・リストはないので(定数)+(要素番号)を変数名にして、配列を模倣します。(長さを事前に決めないとうまく動きません) ・ifはないので条件を行番号にかけて0のときは実行しないようにします。(宣言する順番によってはelse ifなども模倣できます) ・Brainf*ckと記号がマッチしていないことに気を付けます。