Common Lispの系譜を継ぐ、マイコン上のuLispをラズパイPico2上で練習中です。前回は末尾に「p」がつく問いかけ(述語)どものいくつかを練習。今回はその続きです。「ピー」一族ではないけれども、今回はパソコン上のCommon LispとuLispの微妙な違いに遭遇。Lisp素人老人には是非もなし。
※Lispと一緒 投稿順 index はこちら
※実機確認は Raspberry Pi Pico2で行ってます。
※使用させていただいとります uLisp のバージョンは 4.6b (Arm用)です。
※Common Lispとの動作比較のために使わせていただいている処理系は以下です。
SBCL 2.2.2 (SBCL = Steel Bank Common Lisp )
整数なのか、数値なのか、浮動小数なのか
最初は以下のものどもです。
-
- integerp
- numberp
- floatp
動作は名前のとおりです。実行例が以下に。ここではCommon LispとuLispに差異などありませぬ。
文字なのか、文字列なのか
関数的には、
-
- characterp
- stringp
です。そのものズバリの表記なので分かり易いですが。Lisp上での「キャラクタ」型の表記が独特っす。
#\なんたら
「なんたら」のところに、文字 a とか b とか一文字を記することになります。文字列型の方はフツーに “abc” というスタイルです。実行例が以下に。
ここも差異はないようだね。
キーワードなのか
Lisp処理系に登録されているキーワードか否かを判定する関数は、
-
- keywordp
でよいのですが、「キーワード」な「シンボル」というものを書くのがちょっとクセ強でした。こんな感じ。
キーワードシンボルは : で始めないとならんようです。なお、nilも : を先頭につけてやればキーワードと判断してくれるみたい。
boundp、setqの差異に遭遇
さて最後は、変数が値にboundされているのか否かを判定する
-
- boundp
上記の例をみると分かるように、Common Lisp(SBCL)では、未定義の変数 b に対して setq しても値を代入することができ、代入後は boundpで真が返ります。しかしこの setq の挙動は、「Common Lispでは、変数宣言してから変数を使うのがお作法」だけれども、「皆がそういう書き方をするので、気をきかせて」内部的に変数をこしらえてから値をセットする動作をしてくれているみたいです。今となっては良くない書き方?みたい。そのせいか、uLispでは、エラーではねられました。ここはちょっと挙動が違うね。uLisp上でも Common Lisp上でも、 defvar で変数宣言してやれば動作します。
uLisp上では、ちょろまかしをせず、なるべくお作法に則った書き方をせよということかね。知らんけど。