[erlang-questions] core erlang apply requires variable in function position?
Dmytro Lytovchenko
dmytro.lytovchenko@REDACTED
Fri Jul 14 15:22:13 CEST 2017
My guess is that apply command in Core already implies that the code
generator will emit apply/apply_last BEAM opcode which takes Arity * args,
module in Arity'th and a function as Arity+1st register, i.e. there must be
a register store command somewhere (which you do with a let).
The decision itself whether to generate a call or an apply is made earlier
in the compiler chain, and you're past it.
see cerl_cconv:apply_expr
2017-07-14 15:01 GMT+02:00 Mikael Pettersson <mikpelinux@REDACTED>:
> This simple Core Erlang module fails to compile with OTP-20.0.1:
>
> > cat test1.core
> module 'test1' ['test1'/2]
> attributes []
> 'i'/1 =
> fun (_f) -> _f
> 'test1'/2 =
> fun (_f, _x) ->
> apply apply 'i'/1 (_f) (_x)
> end
> > erlc test1.core
> no_file: Warning: invalid function call
>
> and the .beam produced just contains code to throw a badfun error.
>
> The warning comes from sys_core_fold:expr/3:
>
> expr(#c_apply{anno=Anno,op=Op0,args=As0}=App, _, Sub) ->
> Op1 = expr(Op0, value, Sub),
> As1 = expr_list(As0, value, Sub),
> case Op1 of
> #c_var{} ->
> App#c_apply{op=Op1,args=As1};
> _ ->
> add_warning(App, invalid_call),
> ...
>
> indicating that it's not prepared to handle apply forms with
> anything but plain variables in the function position. This
> surprised me since:
>
> 1. I'm generating the above code using the cerl module's constructor
> functions which do not mention this restriction, and
> 2. the module so constructed passes core_lint:module/1, and
> 3. core_pp:format/1 is also happy with it, and
> 4. the Core Erlang language specification document doesn't
> restrict apply's function position beyond the general class
> of expressions.
>
> So is this restriction deliberate or unintentional?
>
> For now I work around it by wrapping the apply with a 'let'
> binding the function position expression to a temporary.
>
> /Mikael
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://erlang.org/mailman/listinfo/erlang-questions
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20170714/2e4b44b5/attachment.htm>
More information about the erlang-questions
mailing list