Method invocation -- why it's not working?

Jonathan M Davis jmdavisProg at gmx.com
Fri Mar 9 03:10:00 PST 2012


On Thursday, March 08, 2012 08:03:09 H. S. Teoh wrote:
> On Wed, Mar 07, 2012 at 11:50:57PM -0800, Jonathan M Davis wrote:
> > On Thursday, March 08, 2012 08:37:38 Comrad wrote:
> > > On Thursday, 8 March 2012 at 06:43:45 UTC, Jonathan M Davis wrote:
> [...]
> 
> > > It's not correct. In TDPL it is clearly stated, that this is a
> > > general feature of the language.
> > 
> > Then please give me a page number. Last time I looked it over, I saw
> > _nothing_ which said that it worked on types in general, and _all_
> > examples used arrays.
> 
> TDPL, p.156, 1st two paragraphs under 5.9.1 "Pseudo Members and the
> @property Attribute":
> 
> 	One syntactic problem is that function invocations so far have
> 	looked like fun(argument), whereas now we'd like to define calls
> 	that look like argument.fun() and argument.fun. The latter
> 	syntaxes are called method invocation syntax and property access
> 	syntax, respectively. We'll learn in the next chapter that
> 	they're rather easy to define for user-defined types, but T[] is
> 	a build-in type. What to do?
> 
> 	D recognizes this as a purely syntactic issue and allows
> 	pseudo-member notation: if a.fun(b,c,d) is seen but fun is not a
> 	member of a's type, D rewrites that as fun(a, b, c, d) and tries
> 	that as well. (The opposite path is never taken, though: if you
> 	write fun(a, b, c, d) and it does not make sense, a.fun(b, c, d)
> 	is not tried.) ...
> 
> In the second paragraph, it seems that it should apply to all types,
> since Andrei says "but fun is not a member of a's type". If 'a' were to
> be restricted only to arrays, why did he say "a's type"? Why didn't he
> say "but fun is not an array method" or something along those lines?
> Granted, the context is speaking about arrays, but the wording "a's
> type" seems to be intentionally generic.

Yeah. That says _nothing_ about UFCS working with types other than arrays. It 
clearly states that the discussion of how to add them to user-defined types is 
discussed in the next chapter (which is on classes and includes defining member 
functions which are methods or properties without any UFCS stuff with free 
functions). It then specifically asks the question about what to do about 
arrays and then goes into an explanation about how you can define free 
functions which can use member invocation syntax and property syntax. 
_Nowhere_ does it discuss adding free functions which work for other built-in 
types (such as int or float), and _nowhere_ does it discuss using free 
functions to add member functions to classes or structs via UFCS.

I think that it's crystal clear that it's _not_ talking about UFCS but rather 
simply using member invocation syntax with arrays.

So, while we may very well end up with UFCS in the language on some level (if 
not completely implemented in all its glory), TDPL does _not_ discuss UFCS. It 
_only_ discusses member invocation syntax on arrays. So, if UFCS were to never 
happen, it wouldn't contradict TDPL.

- Jonathan M Davis


More information about the Digitalmars-d-learn mailing list