Common Lispの系譜を継ぐマイコン上のuLispをラズパイPico2上で練習中です。前回文字列を扱う関数を練習したので、今回は文字列やリスト、あるいは文字列を数値に変換するような関数をいくつか練習してみます。前回はCommon LispとuLispの間に差はなかったですが、今回はいろいろあります。仕方ねえ。
※Lispと一緒 投稿順 index はこちら
※実機確認は Raspberry Pi Pico2で行ってます。
※使用させていただいとります uLisp のバージョンは 4.6b (Arm用)です。
※uLispとCommon Lispとの動作比較のために使わせていただいている処理系は以下です。
SBCL 2.2.2 (SBCL = Steel Bank Common Lisp )
concatenate関数
Common Lispにおいては、concatenate関数は、「シーケンス型」のデータを連結してくれる関数っす。stringは勿論、listも接続可能。ついては接続する型を第1引数に取ります。こんな感じ。
一番上の例のように、文字列2つを連結して文字列にして返してくれることができます。また2番目の例のように、文字列と文字のリストを連結して文字列(string)で返すこともできるし、3番目の例のように、同じ文字列と文字のリストを連結して文字のリストで返すこともできます。リストと文字列、融通無碍じゃのう。
文字列の連結は上手くいくのですが、サポートしているのは文字列だけみたい。リストは不可とな。
subseq関数
subseq関数は、Common Lispにおいては、文字列でもリストでも、所定範囲の要素(サブシーケンス)を取り出してくれる関数です。こんな感じ。
文字列からでもリストからでも取り出せてますなあ。
なんだ、subseqは文字列でもリストでも受け付けてくれます。やれば出来るじゃん?
search関数
さて、search関数は第2引数のシーケンスの中に第1引数のパターンが存在していたらそのインデックスを返してくれる関数です。Common Lispではこんな感じ。
よかった。
read-from-string関数
通常、read-from-string関数は引数に文字列を与えて、それが数値として解釈できるならば、数値を返してくれる関数です。文字列の中身が数値として解釈できない場合はシンボルとして返してくるみたい。Common Lispに「数値として解釈できない文字列」を引数にして与えた場合が以下に。
それに、Common Lisp上では、返り値が2つある(第2返却値の受け取りには専用のマクロ必要)タイプの関数みたいです。使わなかった文字列の先頭文字のインデックスを第2の方に返してくれるみたい。
第1戻り値だけ見ていればCommon Lispと同じだけれども uLispには第2返却値はないのでそこを使うコードは走りませぬ。
本題の「文字列として表された数値」の変換はどうよ。まずはCommon Lisp。
浮動小数でも、16進整数でも、分数(レシオ型、有理数)でも変換は思うがままだと。
だいたい Common Lispと「同じ」だけれども、危ないのが最後の分数のケース。Common Lispでは「数値としての1/3」だったけれど、uLispが返してくる「1/3」は数値ではありません。そもそもuLispには分数(レシオ)型がないもんね。