[m-dev.] context "macros"

Julien Fischer juliensf at csse.unimelb.edu.au
Mon Mar 31 16:15:30 AEDT 2008


On Wed, 26 Mar 2008, Peter Wang wrote:

> On 2008-03-26, Julien Fischer <juliensf at csse.unimelb.edu.au> wrote:
>>
>> On Wed, 26 Mar 2008, Ralph Becket wrote:
>>
>>> Julien Fischer, Tuesday, 25 March 2008:
>>>>
>>>> On Tue, 25 Mar 2008, Peter Wang wrote:
>>>>
>>>>> What do you think of adding support for __file__, __pred__, __line__
>>>>> "macros"?  These would expand into strings or integers like the
>>>>> corresponding C macros.
>>>>
>>>> I have often though something like this would be useful, particularly
>>>> given that the this_file/0 functions we use in the compiler don't
>>>> extend well when sub-modules are involved (you have to qualify them
>>>> if the parent also defines a this_file/0 function.)
>>>>
>>>>> My concern was just about the syntax.  __foo__ has the advantages of
>>>>> following C and requiring no changes to the parser.
>>>>
>>>>> __line__ is a
>>>>> little bit sticky for referential transparency, but __file__ and
>>>>> __pred__ would just act like variables assigned at the start of the
>>>>> predicate.
>>>>
>>>> An alternative syntax suggestion: @line@, @file@ etc ...
>>>
>>> We haven't used the # symbol yet, as I recall.
>>
>> Yes we do, it is used with #line directives (ref. man 2.2).
>>
>> (On an slightly related matter I think we should replace pragma
>> source_file with #file.)
>
> Here is what a change to the reference manual might look like.
> Julien said __ wasn't a great idea because it's still used as a module
> qualifier so we chose $foo or $foo$.  $pred is easier to support than
> $proc and for most code should be equivalent.

For the record $proc gets a bit hairy with --intermodule-optimization.

> Index: doc/reference_manual.texi
> ===================================================================
> RCS file: /home/mercury/mercury1/repository/mercury/doc/reference_manual.texi,v
> retrieving revision 1.424
> diff -u -r1.424 reference_manual.texi
> --- doc/reference_manual.texi	27 Feb 2008 09:46:07 -0000	1.424
> +++ doc/reference_manual.texi	26 Mar 2008 06:33:27 -0000
> @@ -294,6 +294,10 @@
> and then another sequence of decimal digits (the exponent).
> The fraction part or the exponent (but not both) may be omitted.
>
> + at item compiler_defined_literal
> +A compiler-defined literal consists of a dollar sign (@code{$})
> +followed by a name.

Can it be a quoted name (currently yes)?  Or is that not intended?

> @item open_ct
> A left parenthesis, @samp{(}, that is not preceded by whitespace.
>
> @@ -1322,7 +1326,8 @@
> @subsection Data-functors
>
> A data-functor is an integer, a float, a string, a character literal
> -(any single-character name), a name, or a compound data-term.
> +(any single-character name), a name, a compiler-defined literal,
>
> +or a compound data-term.
> A compound data-term is a compound term which does not match
> the form of a special data-term (@pxref{Data-terms}),
> and whose arguments are data-terms.
> @@ -1330,6 +1335,33 @@
> must name a function, predicate, or data constructor declared
> in the program or in the interface of an imported module.
>
> +A compiler-defined literal is one of the following. They will be
> +replaced by constants reflecting the context in which they appear.

I suggest that all Mercury implementations *must* support some of these
e.g., $file, $line, $module etc.

but that Mercury implementations are free to support others, e.g.
$grade for the Melbourne implementation.

> +
> + at table @asis
> + at item @samp{$file}
> +the name of the file (string)

@samp{$file} is a string that gives the name of the file that
contains the module currently being compiled.  If the name of the
file cannot be determined then ...

???

> +
> + at item @samp{$line}
> +the line number (integer)

Likewise, if the line number in unavailable, what happens?

> +
> + at item @samp{$module}
> +the module name (string)
> +
> + at item @samp{$pred}
> +the predicate or function name and arity (string)
> +
> + at item @samp{$grade}
> +the compilation grade (string)
> +
> + at item @samp{$date}
> +the date (string)
> +
> + at item @samp{$time}
> +the time (string)

Maybe these would be better uppercase, $FILE, $LINE, etc ?

Julien.
--------------------------------------------------------------------------
mercury-developers mailing list
Post messages to:       mercury-developers at csse.unimelb.edu.au
Administrative Queries: owner-mercury-developers at csse.unimelb.edu.au
Subscriptions:          mercury-developers-request at csse.unimelb.edu.au
--------------------------------------------------------------------------



More information about the developers mailing list