#:g1: do-allの紹介

Posted 2014-07-07 08:30:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の188日目です。

do-allとはなにか

 do-allは、CLISPの開発者で知られるSam Steingold氏作の対話環境用のユーティリティです。

パッケージ情報

パッケージ名do-all
プロジェクトサイト CLOCC - Common Lisp Open Code Collection / Hg / [e6b24a] /src/cllib/doall.lisp

インストール方法

 CLOCCのプロジェクトサイトからダウンロードしてきて適当に導入します。

$ hg clone http://hg.code.sf.net/p/clocc/hg clocc-hg

で全体のソースも取得できます。
src/cllib/doall.lisp が目的のソースです。

試してみる

 UNIXのユーティリティにyesというのがありますが、気分的にはああいう感じのユーティリティです。
しかし、UNIXのyesのように既存の環境に対してyesを連投するのではなく、do-allに与えた関数内での問い合わせに返答できるという仕組みです。このような形式なのでdo-allは問い合わせをする側に予め組み込んでおき、ユーザーが場合によっては非対話的に処理したいという場合に選択できるようにしたい場合に有用かもしれません。

(cllib:do-all nil 
              (lambda () 
                (dotimes (i 10)
                  (when (y-or-n-p "foo?")
                    (write-line "=> yes")))) 
              (make-list 100 :initial-element 'y))
;>>  foo? (y or n) => yes
;>>  foo? (y or n) 
;>>  Please type "y" for yes or "n" for no.
;>>  foo? (y or n) => yes
;>>  foo? (y or n) 
;>>  Please type "y" for yes or "n" for no.
;>>  foo? (y or n) => yes
;>>  foo? (y or n) 
;>>  Please type "y" for yes or "n" for no.
;>>  foo? (y or n) => yes
;>>  foo? (y or n) 
;>>  Please type "y" for yes or "n" for no.
;>>  foo? (y or n) => yes
;>>  foo? (y or n) 
;>>  Please type "y" for yes or "n" for no.
;>>  foo? (y or n) => yes
;>>  foo? (y or n) 
;>>  Please type "y" for yes or "n" for no.
;>>  foo? (y or n) => yes
;>>  foo? (y or n) 
;>>  Please type "y" for yes or "n" for no.
;>>  foo? (y or n) => yes
;>>  foo? (y or n) 
;>>  Please type "y" for yes or "n" for no.
;>>  foo? (y or n) => yes
;>>  foo? (y or n) 
;>>  Please type "y" for yes or "n" for no.
;>>  foo? (y or n) => yes
;>>  
;=>  <no values>

まとめ

 今回は、do-allを紹介してみました。
考えてみれば、Common Lisp環境にはUNIXのyesのようなものって見掛けないですね。

comments powered by Disqus