    Author: Richard A. O'Keefe <ok(at)cs(dot)otago(dot)ac(dot)nz>
    Status: Final/R12B-5  Implemented in OTP release R12B-5
    Type: Standards Track
    Erlang-Version: OTP_R12B-4
    Created: 22-Sep-2008
    Post-History:
****
EEP 24: Functions may be named using `F/N` in all module attributes
----

Abstract
========

Programmers will be allowed to name functions using the
`F/N` form (currently restricted to) `-export` and `-import`
in any module attribute.  The parser will convert this
to the existing `{F,N}` form so that downstream tools will
be unaffected.

Specification
=============

In any module attribute the form `F/N` (where `F` is an atom and `N` is
a non-negative integer) should be converted to `{F,N}`, provided
that it is not in an expression that would be evaluated.

Other occurrences of `X/Y` are not addressed by this EEP.
In particular, occurrences of `X/Y` in `-record` or `-enum`
declarations would be evaluated, so are not affected.

Motivation
==========

Compare

    -compile({inline,
        [{ukeymerge3_12,13}, {ukeymerge3_21,13},
         {rukeymerge3_12a,11}, {rukeymerge3_21a,13},
         {rukeymerge3_12b,12}, {rukeymerge3_21b,12}]}).

    -deprecated(
        [{new_set,0},{set_to_list,1},{list_to_set,1},{subset,2}]).

with

    -compile({inline, [
        rukeymerge3_12a/11,
        rukeymerge3_12b/12,
        rukeymerge3_21a/13,
        rukeymerge3_21b/12,
        ukeymerge3_12/13,
        ukeymerge3_21/13]}).

    -deprecated([
        list_to_set/1,
        new_set/0,
        set_to_list/1,
        subset/2]).

The improvement in readability is noteworthy, especially if
authors switch to the Prolog practice of putting one `F/N` form
per line in alphabetic order in such lists.

The improvement in consistency is worth having:  it's no longer a
case of `new_set/0` in an `-export` or `-import` module attribute but
`{new_set,0}` in a `-deprecated` module attribute, it's the same in
all module attributes, making it easier to find those that mention
a particular function.

Rationale
=========

Module attributes that contain real expressions, such as `-record`
(and, if it is accepted, `-enum`) require a certain amount of care.
I did consider allowing the `F/N` notation everywhere; after all,
an atom cannot be divided by an integer.  However, with the
`fun F/N` form available, there are these days very few occasions
to refer to a function as `{F,N}` in an expression.

Otherwise, `F/N` occurrences in `-export` and `-import` attributes are
currently converted to tuples (by farity_list), so this is just a
small matter of extending the notion elsewhere.  I cannot imagine
why this wasn't done years ago.

Backwards Compatibility
=======================

There are currently no attributes where `F/N` is accepted,
is not part of an expression to be evaluated, and does not
signify a function, and those where it does signify a function
already treat it as an `{F,N}` tuple.

No existing source code can be affected.

Programs using home-brew front ends instead of the Erlang
syntax tools, such as ones that want to preserve white
space, comments, and so on, will have to be extended by
their maintainers to recognise the new form.  It is
already the case that `{fred,3}` may be written in two
different ways in Erlang source form: `{fred,+3}` is also
allowed.  So such programs already have to cope with
multiple source forms with the same abstract form, and
this merely adds one more variant.

Programs generating Erlang source code should some day
be revised to generate the new form, but since the old form
is not being removed and not (in order to preserve the
value of recent books) even being deprecated, need not be.

Reference Implementation
========================

A single clause needs to be added to the `normalise/1`
function in the parse.yrl file:

    %% Name/Arity case
    normalise({op,_,'/',{atom,_,F},{integer,_,I}}) when I >= 0 ->
       {F,I};

just before the final clause, which raises an exception.
A context diff is provided [eep-0024-1.diff][].

[eep-0024-1.diff]: eep-0024-1.diff
    "Diff to apply to parse.yrl"

Copyright
=========

This document has been placed in the public domain.

[EmacsVar]: <> "Local Variables:"
[EmacsVar]: <> "mode: indented-text"
[EmacsVar]: <> "indent-tabs-mode: nil"
[EmacsVar]: <> "sentence-end-double-space: t"
[EmacsVar]: <> "fill-column: 70"
[EmacsVar]: <> "coding: utf-8"
[EmacsVar]: <> "End:"
