format関数は「String」しか出力できない?
引数として渡されたリストを、別のリストと連結(append)して、それをトップレベルに出力するような関数を書いた。
(defun say-hello (lst) (if (not (null lst)) (if (listp lst) (progn (format t (append '(Hello) (car lst))) (say-hello (cdr lst))))))
この関数に、(Taro Jiro)というリストを渡して実行すると、以下のようなエラーになった。
Error: value (HELLO . TARO) is not of the expected type STRING.
format関数の引数を調べてみると
format STREAM CONTROL-STRING &REST FORMAT-ARGUMENTS
となっている。標準出力(トップレベル)に文字を出力する場合は、STREAMには「T」を指定する。その次は、どうやらStringでないといけないようだ。上記の関数は、以下のように直せばエラーは解消して動作した。
(defun say-hello (lst) (if (not (null lst)) (if (listp lst) (progn (format t "~A~%" (append '(Hello) (car lst))) (say-hello (cdr lst))))))
しかし、実行結果は、(HELLO . TARO)というようにドットリスト(?)で文字が出力される。またしても想定していない状況に・・・appendの2つ目の引数をcarの結果にするとこうなってしまうようだ。