文字列 “JagaimoLISP” から リスト (“J” “a” “g” “a” “i” “m” “o” “L” “I” “S” “P”) を作成します。
予備知識
リストって何?という方はまずはコチラの記事を。
リストに要素を加える関数 cons 、リストの順番を逆にする reverse について。
文字列を部分的にする関数 substr について
文字列からリストに作成
文字列 “JagaimoLISP”から1文字づつ取り出してリストにしていきます。
まずはコマンドラインに入力しながら、一つ一つ動きを見ていきましょう。
setq で変数 Tx に 文字列 “JagaimoLISP” を代入します。
(setq Tx "JagaimoLISP")
この”JagaimoLISP” から最初の1文字目 “J”だけを得るには、関数 substr を使います。
substr の引数は開始位置と最終位置です。この場合、最初の一文字なので、開始も終わりも1です。
(substr TX 1 1)
これで”J” が戻り値になります。
この文字列を 関数 cons を使ってリストに足します。ここで使うリストは 変数 Lst に代入します。
関数 cons に必要な引数は足したい要素とリスト です。
要素は先ほどの (substr TX 1 1)、リストは 変数 Lst です。
最初の文字を足す時には、変数 Lstは何も入っていない nil ですが、nilの場合はリストが作成されます。
(setq Lst (cons (substr TX 1 1) Lst))
これで、(“J”) というリストが 変数 Lst に代入されました。
変数の値を確認したい場合、コマンドラインに !Lst と入力すれば確認できます。
!Lst
1文字目をリストに入れることができたので、Txに入れた文字列から消します。
関数 substr は最終位置を省略すると最後までになります。
開始位置2、最終位置省略にすると、2文字目から最後まで(1文字目を省いた文字列)が戻り値になります。
(setq Tx (substr Tx 2))
これで、変数 Tx に代入された文字列が “gaimoLISP” になりました。
この流れを繰り返すことで、1文字づつバラバラにリストに加えることができます。
(repeat (strlen Tx) ………………) で文字列の文字数繰り返すプログラムができます。
関数 repeat は引数の数だけ繰り返す関数です。
関数 strlen は文字列の文字数を得る関数です。
しかし、この方法で文字列を足していくと、最初に入れた要素がリストの最後になり
(“P” “S” “I” “L” “o” “m” “i” “a” “g” “a” “J”)
というリストになってしまうので、関数 reverse を使って最後に順番を逆にします。
AutoLISPプログラム
上記の流れを一つのコマンドにまとめました。
コマンド名はtest。
文字列をバラバラにしてリスト作成する例のためだけのコマンドなので、単に
(“J” “a” “g” “a” “i” “m” “o” “L” “I” “S” “P”)
とコマンドラインに出てくるだけです。
(defun c:test ( / Tx Lst)
(setq Tx "JagaimoLISP")
(repeat (strlen Tx)
(setq Lst (cons (substr TX 1 1) Lst))
(setq Tx (substr Tx 2))
);repeat
(setq Lst (reverse Lst))
);defun
まとめ
- 関数 substrで文字列を部分的にして、関数consでリストに足していくことで、文字列をバラバラにしたリストを作成できる。
Comments