Uniform Function Call syntax for properties
Robert Jacques
sandford at jhu.edu
Sun Oct 17 09:32:51 PDT 2010
On Thu, 14 Oct 2010 22:22:19 -0400, Steven Schveighoffer
<schveiguy at yahoo.com> wrote:
> On Thu, 14 Oct 2010 20:28:45 -0400, Robert Jacques <sandford at jhu.edu>
> wrote:
>>
>> First, to avoid confusion, I'd like to separate inappropriate usage at
>> the binary level from textual/syntax level. For example, casting,
>> compile-time reflection and .tupleof are all ways to circumvent the
>> fundamental restrictions of a library in order to achieve inappropriate
>> binary access, while alias and 'with()' allow (harmless?) syntactical
>> changes, changing a library's effective API. The decision between what
>> is and isn't inappropriate syntax is generally made by either the
>> language designer or by your project's style guide. Indeed, libraries
>> that define extensive changes in a language's appropriate syntax are
>> often referred to as being domain specific languages instead of a
>> simple libraries, modules or packages. And part of the reason for this
>> nomenclature change is that DSLs, unlike libraries, tend to compose
>> poorly and require varying levels of programmer buy-in. This is one
>> reason why none of the DSL/macro features implemented and/or proposed
>> for D are pervasive; they all have a very specific and defined radius
>> of comprehension and scope.
>
> as well you can rename anything you want. Hell, for most D projects you
> have the source, just rename it!
>
> But if you want your code to be readable, you should follow the
> convention that the author intended, because that's how everyone else
> will read it and understand it.
>
>>
>> Which brings us to the concept of methods behaving syntactically as
>> fields. The three solutions put forth so far are:
>> methods-as-properties, which allow methods to behave like methods or
>> fields; @property, which force specific methods to behave only as
>> fields; and the uniform access principle, which allows methods _and_
>> fields to behave like either methods or fields. Both MAP and UAP are
>> language level syntax changes, while @property gives libraries
>> pervasive DSL-lite abilities. The main advantages of MAP and UAP is
>> that they allow the project team to better select a coding style that
>> suites them. On the downside, neither MAP nor UAP are mainstream
>> concepts, so it can take people time to adapt, and more coding style
>> choice inevitably breeds more coding style wars (i.e.
>> names_with_underscores vs CamelCase, csHangarian vbNotation, sVNs vs
>> longVariableNames, etc.). @property, on the other hand, moves the
>> coding style choice to the library author, which, on the plus side, is
>> similar to how C# handles things. However, it forces the author to
>> choose a single coding style, which may not be appropriate for all
>> users for all time. (read: poor user buy-in) Worse, an author's style
>> choice will enviably conflict with either the project's style
>> guidelines or a second author's library, leading to user code which has
>> to constantly change styles. (read: poor composition) And the
>> composition problem only worsens for generic code.
>
> Couldn't disagree more. An API without appropriate function names ==
> fail. And the call style is part of the function name, like it or not.
> People see x = y, they think field. People see x(y) they think
> function. No matter the camel casing, or spacing between parentheses,
> or prefixes to the function name, or whether the curly brace is on the
> next line or not. It amazes me how many times we have to go over this.
>
>>
>> I fully agree that the ability to define the acceptable syntactic usage
>> is critical to avoiding confusion, I simply believe that putting that
>> responsibility in that hands of a project's style guide provides the
>> best consistency and is the most inclusive. Furthermore, I would point
>> out that ultimately the author serves the user; they are his/her
>> customer and good libraries don't unnecessarily restrict their users.
>> Indeed, one of D's best feature is the collection of things, both great
>> and small, that lets it get out of the way of the coding process.
>
> I want the *compiler* to tell me when I incorrectly used a property, not
> a style guide (which requires a person for interpretation).
>
> -Steve
I think you have misunderstood something. It is partly my fault, as I used
naming styles as an example. More pertinent examples would be function
calls vs operator overloading, or prefix (= x y) vs infix (x = y) vs
postfix (x y =) notation. These are issues which are normally the purview
of the language designer. When the language designer opens up field /
method syntax to programmer control, the assumption that x = y means
fields ceases to be axiomatic and becomes a programming convention/style.
Similarly, that x(y) indicates a function call can also become a
programming convention/style. Other programming languages, for example
Eiffel, have proven the usefulness of field/method styles other than those
of the C-family. In fact Eiffel does not syntactically differentiate
stored values (aka fields) from computed values (aka methods), giving it a
slightly functional feel.
Given a method of control, be it by the Universal-Access-Principal,
Method-as-Properties or @property, users/authors will all write code in
their own preferred style. And although each of these styles is internally
logical and self-consistent, unlike names_with_underscores and
CamelCaseNames, they may violate each others internal assumptions. So,
yes, @property allows the authors to define a compiler enforceable way to
use a property. And that's great when your preferred style and the
author's match. But it also means you're forced to write the equivalent of
'writeln = 42' when your preferred style and the author's don't match.
More information about the Digitalmars-d
mailing list