#:g1: Snow: listの紹介

Posted 2014-01-25 15:00:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の26日目です。

Snow: listとはなにか

 Snow: listは、SchemeのパッケージシステムであるSnow(Scheme Now!)の小規模なリストユーティリティです。

パッケージ情報

パッケージ名Snow: list
SnowSnowfort: list

インストール方法

 手元にSnowのシステムがインストールされていなかったので、まずは、そこからと思いましたが、どうも上手く動きません。
どうも6年位放置されているようで、その間に処理系もアップデートしたりして上手く動かない様子。
一応親切なインストールのチュートリアルはあります

折角なので記念にCommon Lispに移植してみました

 オリジナルのソースを眺めるところでは、やはりMarc Feeley氏の好みが反映されているのか、define*であったり、キーワードが:key形式でなく、key:形式だったりします。
定義されているのは、snow-filterと、snow-apply-appendの二つのみ。

雑学

 snow-filterの定義を見て思ったのですが、リストのtailをeq?で比較しています。
filtした結果が同じなら、元のリストを返すというところですが、古のMacLISP時代には、こういう判定はせずに新たにコンスすることが多かったようで、(subst nil nil x)等でリストを再帰的にコピーする等のイディオムがありました。
Common Lispでは、snow-filterのように判定をするので、そういうイディオムは使えません。まあ、copy-treeがあるので必要もないのですが。(ちなみにappend x nilでcopy-listの代り)

(define (snow-filter pred lst)

(define (filt lst) (if (null? lst) lst (let ((head (car lst)) (tail (cdr lst))) (if (pred head) (let ((new-tail (filt tail))) (if (eq? tail new-tail) lst (cons head new-tail))) (filt tail)))))

(filt lst))

(let ((x '(1 2 (3) ((4)) 5))) (eq? (snow-filter identity x) x)) ;=> #t

(define (snow-filter/ pred lst)

(define (filt lst) (if (null? lst) lst (let ((head (car lst)) (tail (cdr lst))) (if (pred head) (cons head (filt tail)) (filt tail)))))

(filt lst))

(let ((x '(1 2 (3) ((4)) 5))) (eq? (snow-filter/ identity x) x)) ;=> #f

まとめ

 今回は、Snow: listを紹介してみました。
Snowの現状はちょっと寂しいことになっているようで残念でしたが、無駄な雑学を発表できて良かったです。

comments powered by Disqus