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 |

2006-08-20

UNIXでのLisp生活

| 00:42 | UNIXでのLisp生活 - わだばLisperになる を含むブックマーク はてなブックマーク - UNIXでのLisp生活 - わだばLisperになる

UNIXでの生活で非常に身近なものというか概念がフィル

ター。基本的に道具は殆どフィルター。

ここを切り崩さないと、どうしても普段の生活でLispを

使うことにならない気がします。

それで、できればCommon Lispでフィルターをばしばし

書いて行きたいんですが、どうやれば良いのかしらと。

さっぱり分からない訳です。

cat foo.txt | my-cl-filter > bar.txt

このmy-cl-filterの部分が簡単に書けないと生活に密着

したLispライフは送れない、と睨んでいるのです。

それで、こういうのが実現できるものはないかと探して

いるのですが、ちょっと調べた感じでも、なかなか難し

い世界に突入してしまう感じです。

それなりにあるみたいなんですが、総じてドキュメント

が不足していて敷居がかなり高い感が強いです。

cl-launchとか結構良さげなのですが…。

ということで、順当なところで、Gaucheで行くことにし

ました。Common Lispは対処法が見付かったら挑戦しま

す。

スクリプトの引数の処理については、

Kahua HEADのEnjoy Gauche 6. スクリプトプログラム

参考になりました。

それで、catの様なフィルターとして機能するツールの

作成方法ですが、GaucheのマニュアルのSchemeスクリプ

トを書くのcatの例を眺めてみます。

#!/usr/bin/env gosh

(define (main args)   ;entry point
  (if (null? (cdr args))
      (copy-port (current-input-port) (current-output-port))
      (for-each (lambda (file)
                  (call-with-input-file file
                    (lambda (in)
                      (copy-port in (current-output-port)))))
                (cdr args)))
  0)

多分これがスタートラインですが、のっけから分かりま

せん。

地道にということで分解。

最後に0を返してますが、これはスクリプトの終了ステー

タスのようです。


(define (main args)
  128)

の様なスクリプトを実行すれば、

$ echo $?
128

みたいな。

本体を腑分けしてゆくと、ifで引数の有無を確認し、引

数がなければ、inputとoutputポートをそのまま接続し

終了、引数があれば、それをfor-eachでファイルごとに

処理みたいな感じです。

for-eachのところの処理が入り組んでいるので、

for-eachに渡されている無名関数に名前を付けて分解し

てみるとこんな感じかなと。

(define (main args)   ;entry point
  (if (null? (cdr args))
      (copy-port (current-input-port) (current-output-port))
      (for-each cat-a-file
		(cdr args)))
  0)

;; 補助関数
(define (cat-a-file file) 
  (call-with-input-file file
    (lambda(in)
      (copy-port in (current-output-port)))))

なるほど。

しかし、馴れないと難解な世界というか、とっかかりが

なかなか難しい。