Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2011-06-10

CLでSRFI-48

| 19:47 | CLでSRFI-48 - わだばLisperになる を含むブックマーク はてなブックマーク - CLでSRFI-48 - わだばLisperになる

だらだらとSRFIをCLに移植していますが、今回は、SRFI-48 中級の書式文字列です。

SRFI-28にもformatがありましたが、48は機能が増えて中級ということです。CLのformatに比べたら、まだまだってことなんでしょうか。

SRFI-42や、86みたいな例もあることですし、今後のSRFIにとんでもない究極のformatが出てくることを期待しています。

しかし、SRFIって意外と似たものが複数提案される傾向があるんですね。

大体CLのformatに似た感じですが、第二引数が文字列だった場合は、文字列が返ってきたりします。

ちなみに、CLのように文字列指示文字列のところに関数を与えることはできません。

面白いと思ったのは、~Hで、ヘルプが表示されるところ。CLだったらドキュメント文字列にするところだと思いますが、Schemeにそういうものはないので一工夫ということなのでしょう。

(srfi-48:format "~H")
;=> "(format [<port>] <format-string> [<arg>...]) -- <port> is T, nil or an output-port
;   OPTION  [MNEMONIC]      DESCRIPTION     -- Implementation Assumes ASCII Text Encoding
;   ~H      [Help]          output this text
;   ~A      [Any]           (display arg) for humans
;   ~S      [Slashified]    (write arg) for parsers
;   ~W      [WriteCircular] like ~s but outputs circular and recursive data structures
;   ~~      [tilde]         output a tilde
;   ~T      [Tab]           output a tab character
;   ~%      [Newline]       output a newline character
;   ~&      [Freshline]     output a newline character if the previous output was not a newline
;   ~D      [Decimal]       the arg is a number which is output in decimal radix
;   ~X      [heXadecimal]   the arg is a number which is output in hexdecimal radix
;   ~O      [Octal]         the arg is a number which is output in octal radix
;   ~B      [Binary]        the arg is a number which is output in binary radix
;   ~w,dF   [Fixed]         the arg is a string or number which has width w and d digits after the decimal
;   ~C      [Character]     charater arg is output by write-char
;   ~_      [Space]         a single space character is output
;   ~Y      [Yuppify]       the list arg is pretty-printed to the output
;   ~?      [Indirection]   recursive format: next 2 args are format-string and list of arguments
;   ~K      [Indirection]   same as ~?
;   "

移植について

参照実装が、一関数で300行越えの塊というところに若干めげそうになりましたが、名前空間の汚染を嫌ったかなにかで一つに纏まっているだけのようなので分解して定義しました。

また、ソースがぶらさがり括弧派のコードで、Schemeにもそういう人はいるんだなと妙に感心。