#:g1: formatの紹介

Posted 2014-07-29 14:30:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の210日目です。

formatとはなにか

 formatは、Felix Winkelmann氏とKon Lovett氏作のChicken用のCommon LispのFORMAT互換のライブラリです。大元のコードはSLIBのDirk Lutzebaeck氏作のものとのこと

パッケージ情報

パッケージ名format
Chicken eggs:format - The Chicken Scheme wiki

インストール方法

$ sudo chicken-install format

すれば、

(use format)

(require-extension format)

試してみる

 SRFIにもSRFI 28、48でFORMATはありますが、基本的な機能のみなのでCommon LispのFORMATとは違ったものになっていますが、このformatは結構頑張っています。(大元のSLIB版が結構頑張っている様子)。
どうも入れ子になったループの挙動が少し違っているようです。
とはいえ、大半の処理はそのまま移植できそうです。

(format #f "~A" "こんにちは")
;=> "こんにちは"

(format #t "~80~") ;=> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ;=> #t

(format #t "~50@{=~}" #f) ;>> ================================================== ;=> #t

(format #t "~V@{~A~:*~}" 50 "*") ;>> ************************************************** ;=> #t

(format #t "~3@{~A~:*~}~* ~4@{~A~:*~}~* ~5@{~A~:*~}~%" 'a 'b 'c) ;>> aaa bbbb ccccc ;=> #t

(format #t "~V@{~A~:*~}~* ~V@{~A~:*~}~* ~V@{~A~:*~}~%" 3 'a 4 'b 5 'c) ;>> aaa bbbb ccccc ;=> #t

(format #t "~@{~V@{~A~:*~}~*~^ ~}~%" 3 'a 4 'b 5 'c) ;!> error

;; Common Lispでは下記は可能 (format t "~@{~V@{~A~:*~}~*~^ ~}~%" 3 'a 4 'b 5 'c) ;>> AAA BBBB CCCCC ;=> NIL

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

;; Common Lisp では下記で可能 (format t "~{~V@{~A~:*~}:~:*~A~*~%~}" '(13 = 5 \# 22 % 18 + 40 % 2 *))

(format #f "Toggle ~:[OFF~;ON~]" #f) ;=> "Toggle OFF"

(format #f "Toggle ~:[OFF~;ON~]" #t) ;=> "Toggle ON"

;; 行幅16で右寄せ 埋め草文字は "." (format #f "~16,,,'.@A" "foo") ".............foo"

 Common Lispだと

(format t "~@{~A~:*~}" 1)

のようなものは無限ループになってしまいますが、Chicken版では上限を設定することが可能で、デフォルトは100になっています。

format:iteration-bounded
;=> #t

(define format:max-iterations 10)

(format #f "~@{~A~:*~}" 1) ;=> "1111111111"

まとめ

 今回は、formatを紹介してみました。
やはり、これはCommon Lispのコードを移植する時に便利そうですね。

comments powered by Disqus