新・ニコ動でLisp
また作りました。
コメントにあるとおり、ニワン語(ニコニコ動画上のスクリプト言語)の仕様変更のため、
以前作ったものがまともに動かなくなってしまいました。
なんとか動くようにと頑張ってみたんですが、途中で力尽き、
「これはもう、一から作り直したほうが早いんじゃないのか?」
と思い、作り直したという流れです。
ニワン語もいつの間にか使いやすくなったもので、
たったの50行ほどで書けてしまいました(ソースはこちらから)。
しかし、相変わらずよく分からない挙動をすることがあり、苦労します。
今回、ダイナミックスコープになっているのは、その妙な挙動に悩まされたためです。
最初はレキシカルスコープでつくっていたんですが、
環境の書き換えを(配列を破壊的に書き換えることにより実現)するところで、
何故か変数が壊れたり変な動作をしたり、変な動作をするようになりました。
私のプログラムが悪いのじゃないかと思い、
数時間に渡るデバッグをしたものの原因は分からず。
配列の書き換えを避けるためにダイナミックスコープにしたという訳です。
(変数の参照先は書き換えるが、配列自体は書き換えない。ソース中のgenvを参照)
スコープ以外の仕様は以前のものとほぼ同じです。
**NewNicoLisp 仕様**
<サポートする関数>
car
cdr
cons
eq (数の比較もこれで行う)
atom
+ (引数は任意個)
– (引数は2つ)
eval
<サポートするスペシャルオペレータ>
quote
if
progn
lambda
defun
<データ>
シンボル (日本語なども使用可能)
数 (入力時は非負整数のみ)
コンス (今のところはimmutable)
その他 (SUBR、FSUBR、EXPR)
<リーダ>
quoteのリーダマクロあり
ドット記法の入力は未対応
<スコープルール>
ダイナミックスコープ
[…] 新・ニコ動でLispを作った ニコスクリプト(ニワン語?)の仕様が変わって、かつて書いたものが動かなくなったので、書き直しました。 […]