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-07-31

Common Lispと改行コード

| 10:47 | Common Lispと改行コード - わだばLisperになる を含むブックマーク はてなブックマーク - Common Lispと改行コード - わだばLisperになる

最近、勉強会の進行などをしているため、分からないことは、はっきり説明できるまで書けないような気持ちになってしまっていますが、よくよく内省してみれば、自分はただの初心者日曜プログラマなので、妙に自分の中で敷居を高くすることはせず、間違ったことに対しては、ツッコミを期待するとして、思い付いたことを素直に書くことにしました。

とはいえ、あんまり「初心者、初心者」と連呼する訳にもいかない流れにはまってしまうこともあるので、そういう場合はしょうがないですね…。

でも、きちんとしたことはきちんとした人が書けば良いのです(笑)

ということで、zickさんの「リリカル☆Lisp開発日記 » ページが見つかりませんでした」のエントリを読んだので、そういえば、改行問題ってありますなーと思いつつ。自分も対策を知らないのでエントリを書いてみることにしました。

CRやLFの扱いついては、確か、色々問題があったのをどっかで読んだ憶えがあるのですが、見付けられませんでした(^^;

たしか、#\Linefeedや、#\Returnという文字のCLでの扱い自体にも問題があったような…。

ということで、自分ならどうするのかということでコードを書いてみたのですが、遅そうですねー。

;; 虫入り
(defun chomp-read-line (&optional (stream *standard-input*) (eof-error-p t)
                                  eof-value recursive-p)
  (let ((line (read-line stream eof-error-p eof-value recursive-p)))
    (if (eq line eof-value)
        eof-value
        (let ((pos (position #\Return line :from-end 'T)))
          (if pos
              (subseq line 0 pos)
              line)))))

;; 修正したもの
(defun chomp-read-line (&optional (stream *standard-input*) (eof-error-p t)
                                  eof-value recursive-p)
  (let* ((line (read-line stream eof-error-p eof-value recursive-p))
         (llen (length line)))
    (if (eq line eof-value)
        eof-value
        (delete #\Return line :from-end t :end llen :start (1- llen)))))

(print (series:scan-file "/tmp/foo.txt" #'read-line))
;=> #Z("こんにちは^M" "おはようございます^M") 

(print (series:scan-file "/tmp/foo.txt" #'chomp-read-line))
;=> #Z("こんにちは" "おはようございます") 

この方式で対処する場合、この例のようにラッピングするのではなく、逆に遡ってカスタマイズしたread-lineを書くことになるのでしょうか。

CLで学ぶ「プログラミングGauche」 (9.4)

| 08:49 | CLで学ぶ「プログラミングGauche」 (9.4) - わだばLisperになる を含むブックマーク はてなブックマーク - CLで学ぶ「プログラミングGauche」 (9.4) - わだばLisperになる

9.4 連想リストふたたび

連想リストについての復習といった感じ。

元の連想リストを破壊的に変更したりする例を取り上げています。

CLでも同じ感じかなと。