Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2008-08-01

Common Lispと改行コード (2)

| 12:11 | Common Lispと改行コード (2) - わだばLisperになる を含むブックマーク はてなブックマーク - Common Lispと改行コード (2) - わだばLisperになる

前回中途半端なエントリだったお蔭なのか所為なのか、Common Lispと改行コードのエントリについてLingrでも色々議論して頂き、コメントも頂きという感じでした。

それで、一通りの流れをまとめますと、

  1. 改行コードは処理系毎に external-formatに指定するのが一般的
  2. SBCLがその辺に対応できてない様子

という感じで、敢えて文字列を加工するとしたら、deleteや、string-trimで、ということみたいです。

ちなみに前回の自分のpositionを使ったものだと、#\Returnを探しているので、途中に#\Returnが出現した場合、それ以降を失なってしまいます…。

それと、zickさんの元エントリを良く読むと、「書き込むときは~%一発で済ませたいものです。」とのことで自分は問題を半分しか把握してませんでした(^^;

ですよね、書き込みも統一したいですよねと。

その辺も含めると、いまのところexternal-formatで指定するのが一番のようです。

処理系が対応してれば、のようで残念ながらSBCLでは対応してないんですよね。

ということでSBCL以外は、標準でなんとかできるようなので、SBCL+flexi-streamsで考えてみました。

;; CR+LF(DOS)で読んで、CR(Mac)で書き出す
(with-open-file (in "/tmp/crlf-in.txt" :element-type '(unsigned-byte 8))
  (with-open-file (out "/tmp/crlf-out.txt" :direction :output :if-exists :supersede :element-type '(unsigned-byte 8))
    (let ((in (flexi-streams:make-flexi-stream in :external-format :utf-8))
          (out (flexi-streams:make-flexi-stream out :external-format :utf-8)))
      (setf (flexi-streams:flexi-stream-external-format in) '(:utf-8 :eol-style :crlf)) ;crlf
      (setf (flexi-streams:flexi-stream-external-format out) '(:utf-8 :eol-style :crlf)) ;cr
      ;; 処理本体 -- この例では読んで書くだけ
      (loop :for line := (read-line in nil nil) :while line
            :do (format out "~A~%" line)))))

しかし、これだとflexi-streamが日本語のエンコードで身近なところだとUTF-8にしか対応してないので、EUC-JP、SJIS、JISでは駄目なんですねー。

SBCLもexternal-formatで改行指定できるようになるか、flexi-streamが色々対応してくれるかしてくれると良いんでしょうか。

また、前回の「たしか、#\Linefeedや、#\Returnという文字のCLでの扱い自体にも問題があったような…。」といううろ覚えは、#\Newlineの扱いの変化についてでした。

上の例でも、~%が#\Newlineを出力している訳なのですが、この場合は、CR+LFで出力しています。