[erlang-questions] definition of iolist

David Mercer dmercer@REDACTED
Wed Sep 12 23:27:14 CEST 2007


On Friday, August 31, 2007, Kostis Sagonas wrote:
> PS. I've repeatedly mentioned to the OTP group that there is very little
>      reason for an IOList to allow binaries in the tail.

And what did they say?

>      Allowing binaries in the tail of the list only saves one cons cell
>      but it disallows the use of many/most lists functions for IOLists.
>      For example lists:length/1 cannot be safely used for IOLists because
>      its use may or might not throw an exception.

Good point.

>      IMO, IOLists should not allow for binaries in the tail position.
>      Other than that, IOLists are great.

I had an aha! moment last night thinking about this (yes, two weeks late,
but it had to be queued in a LIFO stack in my mind until I had brain cycles
to spare), and I thought that iolist() probably permits a binary() as the
tail because a binary() is an iolist()!  By allowing it in the tail,
iolist-processing functions can recursively call themselves on the tail of
an iolist() and if it's a binary(), everything's OK.  Cool.

Tried this to test:


	5> erlang:iolist_to_binary(["abcdefg"| <<"h">>]).
	<<"abcdefgh">>
	6> erlang:iolist_to_binary([<<"h">>]).           
	<<"h">>
	7> erlang:iolist_to_binary(<<"h">>).  
	<<"h">>
	8> erlang:iolist_to_binary("h").    
	<<"h">>
	9> erlang:iolist_to_binary($h). 
	
	=ERROR REPORT==== 12-Sep-2007::15:55:56 ===
	Error in process <0.36.0> with exit value:
{badarg,[{erlang,iolist_to_binary,"h"
	},{erl_eval,do_apply,5},{shell,exprs,6},{shell,eval_loop,3}]}
	
	** exited: {badarg,[{erlang,iolist_to_binary,"h"},
	                    {erl_eval,do_apply,5},
	                    {shell,exprs,6},
	                    {shell,eval_loop,3}]} **

So far my, my theory was right.  Line 7 passes a naked binary to
erlang:iolist_to_binary/1 and it works.  Line 9 shows that a naked
character, on the other hand, is not acceptable, consistent with my theory.

BUT it turns out there is another inconsistency with iolists, and that is
that erlang:iolist_to_binary/1 is documented as accepting an
iolist()|binary().  So instead of their being consistent in my mind, they
become even more inconsistent by naming a function iolist_to_binary which
does not have the type iolist() -> binary() as you might expect.  No, that
function is named list_to_binary, which is quite bizarre.

Cheers,

DBM




More information about the erlang-questions mailing list