Shammer's Philosophy

My private adversaria

LISP で改行しながら文字列出力する・改

LISP で改行しながら文字列出力する - Shammerismの実装では、改行が一行ごとにならなかったので別の方法を考えてみました。write というのがあるのでそれでできるかなと思ったのも束の間、以下のようなエラーに。

(with-open-file (f "file.txt" :direction :output)
  (let ((lines (list "aaa" "bbb" (concatenate 'string "ccc" "ddd"))))
    (dolist (line lines)
      (write line f)
      (terpri f))))
(quit)
> Error: Incorrect keyword arguments in (#<BASIC-FILE-CHARACTER-OUTPUT-STREAM ("file.txt"/5 UTF-8) #x302000EF97ED>) .
> While executing: #<Anonymous Function #x302000EFC28F>, in process listener(1).
> Type :GO to continue, :POP to abort, :R for a list of available restarts.
> If continued: Skip loading "test.lisp"
> Type :? for other options.

原因は stream の渡し方。write-line では stream object のみでよかったのだが、write の場合は keyword も一緒に渡す必要があるようだ。以下のように修正して実行できた。

(with-open-file (f "file.txt" :direction :output)
  (let ((lines (list "aaa" "bbb" (concatenate 'string "ccc" "ddd"))))
    (dolist (line lines)
      (write line :stream f)
      (terpri f))))
(quit)