#:g1: YTools: outの紹介

Posted 2014-11-06 15:00:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の311日目です。

YTools: outとはなにか

 YTools: outは、Drew McDermott氏のユーティリティであるYtoolsの中の出力系のユーティリティです。

パッケージ情報

パッケージ名YTools: out
Quicklisp×
プロジェクトページHome page for Drew McDermott
CLiKiCLiki: YTools

インストール方法

 上記プロジェクトページからダウンロードしてきて適当に導入します。

試してみる

 YToolsは、1976年からMcDermott氏がまとめてきたLispのユーティリティ集です。YToolsには詳細な50ページのマニュアルがあるので詳しくはそちらを参照してください。
outについては、formatと比較した文献もあります。

 最も基本的な使い方としては、outに文字列を与えれば*standard-output*に出力します。

(out "x")
;>>  x
;=>  <no values>

 ストリームの指定を省略すると*standard-output*ですが、:toでストリームを指定することもできます。また、formatと同じくnilで文字列を生成するようです。

(with-output-to-string (o)
  (out (:to o) "x"))
;=>  "x"

 改行は、:%で、数字は数値分の空白を出力します

(out 10 "x" :% 9 "x" :% 8 "x")
;>>            x
;>>           x
;>>          x
;=>  <no values>

 :eで節を作ることが可能で、この節の中では、:oで囲んだ式を出力します。繰り返し等で使えます。

(out "start" :%
     (:e (repeat :for ((_ = 1 :to 10))
           (:o "foo"))) :%
     "end" :%)
;>>  start
;>>  foofoofoofoofoofoofoofoofoofoo
;>>  end
;>>  
;=>  <no values>

適当な利用例

(defun join (strings sep)
  (out (:to nil)
       (:e (repeat :for ((e :in strings :tail etail))
             (:o (:a e)
                 (:q ((cdr etail)
                      (:a sep))))))))

(join '("a" "b" "c") "-") ;=> "a-b-c"

out vs format
(format t "~{~V@{~A~:*~}:~:*~A~*~%~}" '(13 = 5 \# 22 % 18 + 40 % 2 *))
;>>  =============:13
;>>  #####:5
;>>  %%%%%%%%%%%%%%%%%%%%%%:22
;>>  ++++++++++++++++++:18
;>>  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%:40
;>>  **:2
;>>  
;=>  NIL

(out (:e (loop :for (times pat . _) :on '(13 = 5 \# 22 % 18 + 40 % 2 *) :by #'cddr :do (dotimes (i times) (:o (:a pat))) (:o ":" times :%)))) ;>> =============:13 ;>> #####:5 ;>> %%%%%%%%%%%%%%%%%%%%%%:22 ;>> ++++++++++++++++++:18 ;>> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%:40 ;>> **:2 ;>> ;=> <no values>

;;; YToolsのrepeatと組み合わせてみた例 (out (:e (repeat :for ((x = '(13 = 5 \# 22 % 18 + 40 % 2 *) :then (cddr x))) :while x (match-let (?times ?pat . ?_) x (dotimes (i times) (:o (:a pat))) (:o ":" times :%))))) ;>> =============:13 ;>> #####:5 ;>> %%%%%%%%%%%%%%%%%%%%%%:22 ;>> ++++++++++++++++++:18 ;>> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%:40 ;>> **:2 ;>> ;=> <no values>

まとめ

 今回は、YTools: outを紹介してみました。
YToolsのユーティリティを使って描くと、なんとなく独特の雰囲気が出ますが、1970年代後半から1980年代にかけてはこういう見た目のコードが結構多い気もします。

comments powered by Disqus