#:g1: typed-listsの紹介

Posted 2014-08-04 23:30:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の217日目です。

typed-listsとはなにか

 typed-listsは、Juergen Lorenz氏作の型付きリストのライブラリです。

パッケージ情報

パッケージ名typed-lists
Chicken eggs:Rationale - The Chicken Scheme wiki

インストール方法

$ sudo chicken-install typed-lists

すれば、

(use typed-lists)

(require-extension typed-lists)

試してみる

 Lisp系言語では、リストの要素の型を制限したりすることはあまりないですが、リストの要素に型を付けようというものです。

(define-list-type name
  documentation: docu
  item-predicate: ok?
  item-equality: equ?
  procedure-prefix: pre)

という定義用の構文があり、これで定義すると、

(define-list-type lon
  documentation: nlists
  item-predicate: number?
  item-equality: (lambda (x y)
                   (and (number? x)
                        (number? y)
                        (= x y)))
  procedure-prefix: n)

(lonnull? (lon)) ;=> #t

(lon? (lon 1)) ;=> #t

(lon 1 2 3 4) ;=> (1 2 3 4)

(lon 1 2 3 4 (lon 5 6)) ;!> Error: bad argument type to variant constructor

(define-list-type los documentation: slists item-predicate: string? item-equality: (lambda (x y) (and (string? x) (string? y) (string= x y))) procedure-prefix: s)

(los "di" "badios" "bamatu")

(losnull? (los "di" "badios" "bamatu")) ;=> #f

(loslength (los "di" "badios" "bamatu"))

(losequal? (los "di" "badios" "bamatu") (los "di" "badios" "bamatu")) ;=> #t

(losappend (los "di" "badios" "bamatu") (los "di" "badios" "bamatu")) ;=> ("di" "badios" "bamatu" "di" "badios" "bamatu")

という感じで使えます。
ドキュメントでは、procedure-prefix:を指定すると、接頭辞に短いものを付けられるようなのですが、どうも上手く動きません。
最近公開されたばかりなので、ちょこちょこ修正されているのかもしれません。
述語が定義構文によってまとめて定義されるのは便利ではあるのですが、好き嫌いが分かれる所かもしれません。

まとめ

 今回は、typed-listsを紹介してみました。
リストの要素に型が付いていると便利だなと思うことはたまにはありますね。

comments powered by Disqus