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)