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-25

SERIESでファイル処理

| 01:15 | SERIESでファイル処理 - わだばLisperになる を含むブックマーク はてなブックマーク - SERIESでファイル処理 - わだばLisperになる

夏バテのせいなのか、鬱のせいなのか、行動する気力が全然湧いてきません(;´Д`)

しかし、何か書かなくてはいけないという強迫観念が収まらないので、2chのCL入門スレでみつけた質問に挑戦してみたいと思います(笑)

お題

CL入門スレ128さんの質問。ファイルから特定の行を抽出し、その行のみ新たにファイルへ書き出す。

(make-thread :name common-lisp :part 5)

(use-package :series)
(series::install)

(defun kakikaki (infile outfile lines)
  (collect-file-supersede outfile
   (choose (mask (choose-if #'plusp (#M1- (scan (sort (copy-list lines) #'<)))))
           (scan-file infile #'read-line))
   #'write-line))

;; 補助マクロ(ファイルが存在する場合は上書きする: 今回の問題には本質的には関係なし)
(defmacro collect-file-supersede (file items &optional (printer #'print))
  `(progn
     (when (probe-file ,file)
       (delete-file ,file))
     (collect-file ,file ,items ,printer)))

実行

(kakikaki "/etc/passwd" "/tmp/baz" '(400 2 4 8 -1))

抜き出したい行をリストで指定します。ファイル行数の範囲を越えた指定は無視されます。

結果

$ cat /tmp/baz
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh