Shammer's Philosophy

My private adversaria

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の結果にするとこうなってしまうようだ。