[erlang-questions] Help: What's the correct way to add new BIFs?
G Bulmer
gbulmer@REDACTED
Mon Mar 10 13:17:13 CET 2008
Bjorn
Thank you.
> G Bulmer writes:
>> I want to add a few new BIFs to erts for some DTrace experiments, and
>> I'd like some pointers/advice.
>> (They may not end up in the solution, so please don't panic yet:-)
>>
>> Is there a document which describes the correct approach? (I thought
>> I'd seen it a few months ago, but I, google and spotlight can't find
>> it :-(
>>
>> The questions I'd like some help/advice with are:
>> 1. I read (in bif.tab) that ubifs are bif's without trace wrappers.
>> Is
>> this a critical decision, or is it okay to use ubifs, and decide
>> later?
>
> You should use bif; ubifs are only for guard BIFs.
Thank you. That clears that up.
I would like to make the two predicates (is_dtrace_on/0 and
is_dtrace_off/0 ) available in guard expressions.
I have them in bif.tab as:
ubif erlang:is_dtrace_on/0
ubif erlang:is_dtrace_off/0
but they do not show up as directly usable (without the erlang: syntax).
If I use that erlang:is_dtrace_on() syntax I get a compile-time error,
e.g. :
f() when erlang:is_dtrace_on() ->
I noticed e.g. is_tuple() is a ubif, and is_tuple() can be used in
guards.
It's ebif is in erl_pbifs.c, and it's its source is in erl_bif_op.c,
and there doesn't appear to be anything magic there.
It has an entry in erl_bif_table.c, which is auto-magically generated
by make_table.
I would like to understand the machinery that enables is_tuple() to
appear in guard expressions.
It doesn't look different in make_table, and its input bif.tab
(is_tuple isn't in atom.names).
So I assume that it is possible for us to add new guard predicates,
and that I am missing some other piece of machinery.
What other things are needed to do enable e.g. is_dtrace_on/0 to work
in a 'when' guard?
>> This example seems to define the same bif twice. What is this doing
>> really? What is the atom 'erl.lang.number' or 'erl.lang.binary' for?
>> (I've read the make_tables script, but my perl is bad, so it isn't
>> clearto me, sorry.)
>
> You only need to define one name for your BIF. The other type of name
> is for the package system, which is currently unsupported. If you
> look at the end of the file, you can see that we no longer add
> duplicate
> names.
That is very helpful. I had read the entries and the end of bif.tab,
and have followed that convention, but I felt uncomfortable that I
didn't understand what was happening.
>> ... snip ...
>
>> Are there some naming conventions I should follow to align with the
>> OTP team?
>
> We generally use "erl_" prefix for all new source code files.
>
>> ... snip ...
> /Bjorn
> --
> Björn Gustavsson, Erlang/OTP, Ericsson AB
Thank you again for your help.
GB
More information about the erlang-questions
mailing list