[erlang-questions] io_lib format inconsistancies

Andrew Thompson <>
Fri Sep 7 21:03:29 CEST 2012


I wrote a quickcheck test for lager to compare its formatting to io_lib,
and I found a bunch of dissimilarities. However, a couple of the things
I found didn't make a lot of sense, so I figured I'd ask here for an
explanation.

First one:

1> io:format("~P", [<<>>, 1]).
<<>>ok
2> io:format("~W", [<<>>, 1]).
<<...>>ok
3> io:format("~P", [<<1>>, 1]).
<<...>>ok
4> io:format("~W", [<<1>>, 1]).
<<...>>ok

As you can see, ~P and ~W behave differently on the empty binary, but
behave the same when the binary isn't empty. Seems a bit weird.

The other one that bothers me:

16> io:format("~P", ['hello world', 2]).
'hello world'ok
17> io:format("~P", ["hello world", 2]).
"hello world"ok
18> io:format("~P", [<<"hello world">>, 2]).
<<"hell"...>>ok
19> io:format("~W", ['hello world', 2]).
'hello world'ok
20> io:format("~W", ["hello world", 2]).
[104|...]ok
21> io:format("~W", [<<"hello world">>, 2]).
<<104,...>>ok

Why does a 'depth' of 2 mean we print the <<>> and the first *four*
characters of a binary? ~W behaves much more logically. Also why does
depth not apply to printable lists, but it does to binaries?

I've got a branch now for lager to be compatible with this madness, but
I wondered if anyone knows *why* things are like this?

https://github.com/basho/lager/pull/77

Andrew



More information about the erlang-questions mailing list