2007/11/13

[Common Lisp] たまには何か書かないと

ここのところ全然 Lisp をさわってなかったので、何でもいいから書きたくなりました。
それで書いたのが次のコード。
series を使って、/tmp/a 内容を /tmp/b に行番号付きで出力するだけです。
scan-file, collect-file では external-format や if-exists の指定ができないため、scan-stream, collect-stream を使っています。

(eval-when (:compile-toplevel :load-toplevel :execute)
(require :series))

(with-open-file (in "/tmp/a")
(with-open-file (out "/tmp/b" :direction :output :if-exists :supersede)
(let ((no (series:generator (series:scan-range :from 1))))
(series:collect-stream
out (series:scan-stream in #'read-line)
#'(lambda (line stream)
(format stream "~a ~a~%" (series:next-in no) line))))))

scan-file, collect-file を使うとこんな感じです。
(let ((no (series:generator (series:scan-range :from 1))))
(series:collect-file
"/tmp/c" (series:scan-file "/tmp/a" #'read-line)
#'(lambda (line stream)
(format stream "~a ~a~%" (series:next-in no) line))))

やっぱり Common Lisp は楽しい♪

0 件のコメント: