[erlang-questions] [Bug] io:setopts and expand_fun option

igwan igwan@REDACTED
Sun Feb 11 23:12:49 CET 2007


Hello,

I encountered a problem while playing with io:setopts trying to set the 
expand_fun option :

5> Completion = fun("") -> {yes, "start", ["start", "stop"]};
5> (_) -> {no, "", ["start", "stop"]} end.
#Fun<erl_eval.6.56006484>

6> io:setopts([{expand_fun, Completion}]).
{error,badarg}

7> io:setopts([binary]).
ok

8> io:setopts([binary, {expand_fun, Completion}]).
ok

The problem is that setopts doesn't accept the 'expand_fun' option 
alone, it has to be provided along with either 'binary' or 'list' options.
This is not stated in the documentation.
The faulty code seems to be located in kernel/group.erl :

%% setopts
setopts(Opts0,_Drv, Buf) ->
    Opts = proplists:substitute_negations([{list,binary}], Opts0),
    put(expand_fun, proplists:get_value(expand_fun, Opts, get(expand_fun))),
    case proplists:get_value(binary, Opts) of
    true ->
        put(read_mode,binary),
        {ok,ok,Buf};
    false ->
        put(read_mode,list),
        {ok,ok,Buf};
    _ ->
        {error,{error,badarg},Buf}
    end.

expand_fun is put in the process dictionary even if we get a {error, 
badarg} in response. I think it is not the intended behaviour. At least, 
it doesn't meet my expectation of "least astonishment"  :)

igwan




More information about the erlang-questions mailing list