Please no. The absence of sigils in Go is one of the syntactic features of the language that make it light to read.
I don't want a symbol that, even if only due to external cultural context, suggests that the code is trying to say something exciting. On Fri, 2018-10-26 at 03:22 -0700, alan.f...@gmail.com wrote: > Inspired to some extent by Ian's idea, I've had another idea which > could > rid us of the *new keyword problem* not just for Go 1.xx or Go 2 but > for > ever. We wouldn't even have to worry about whether a new keyword > could be > restricted to *contextual* use or not. > > Suppose any new keyword introduced from Go 1.xx onwards could only > begin > with a lower case letter and could *optionally* be followed by the > *!* > symbol for disambiguation purposes. So, one could potentially have > check!, > handle!, contract! and so on. > > Suppose further that: > > 1. If you didn't use *!* and there was some local entity in an > *encompassing > scope* with the same name as the keyword, the compiler flagged it as > an > error. > > 2. If you did use *!* unnecessarily, the compiler would also flag > that as > an error. > > Now in the first case, you'd have the choice of either changing the > name of > the local entity to a non-keyword or adding *!* to the keyword > usage(s). In > practice, most people would probably choose the former. > > In the second case, you'd simply remove the *!* and that would be the > end > of the matter. > > Technically, an *encompassing scope* would be any scope which was or > included the scope in which the new keyword were being used. It > would > therefore always include package scope as a minimum. > > The advantages of this approach would be: > > 1. *!* would probably be seldom needed and so shouldn't impact too > adversely on the *look* of the code. Over time, people might simply > learn > to avoid using the new keywords as normal identifiers at least at top > level > within the package. > > 2. Existing code or new code using the *old* approach would continue > to > compile without problem. > > 3. Any function or method which didn't use any new keywords as such > could > still freely use them as identifiers for parameters, local variables > or > local constants. Disambiguation (or the lack of it) with similarly > named > top level entities (including new keywords) would be the same as it > is > today - the latter would simply be hidden. > > 4. Basically, you could just program normally (without *!*) knowing > that > the compiler would flag up any clashes. > > 5. Clashes with imported names would never be a problem because > they'd > usually be qualified by their package name and would begin with an > upper > case letter anyway. > > Although other symbols such as $, %, @ or ? could be used in place > of* !*, > I think the latter is probably the best choice as (to me at least) it > looks > less intrusive than the others and doesn't have any other > connotation. It's > also used (for different disambiguation purposes) in other modern > languages > such as Rust and Swift. > > As far as the generics proposal is concerned, the use of the > contract > keyword (which always appears at top level within the package) would > only > be flagged as ambiguous if there were another similarly named top > level > entity. Any use of *contract* within a function or method would not > be a > problem because of #3 above > > So what do you think, a viable idea or not? > > Alan > > On Wednesday, October 24, 2018 at 3:22:03 PM UTC+1, Ian Lance Taylor > wrote: > > > > > > On Wed, Oct 24, 2018 at 3:49 AM, alanfo <alan...@gmail.com > > <javascript:>> > > wrote: > > > > > > > > > I quite like the draft error handling design and haven't (so > > > far) > > suggested > > > > > > that any changes be made. > > > > > > However, one aspect I don't like is 'check' and 'handle' having > > > to be > > > keywords which means that the design is not Go 1 compatible. > > > Also, > > whilst I > > > > > > agree that these words are probably the best ones for the job > > > (and I > > would > > > > > > hate to see them replaced by obscure symbols) it seems a pity > > > that such > > > commonly used words will no longer be available as ordinary > > > identifiers. > > > > > > So all I'm asking here is whether - if the design were adopted as > > > it > > stands > > > > > > - they could be 'contextual' rather than 'full' keywords? I > > > couldn't > > find > > > > > > any mention of this in the draft papers but apologize in advance > > > if it's > > > been addressed and I've missed it. > > > > > > As far as this thread is concerned, I'm only interested in this > > > question > > and > > > > > > not what people think of the design generally. > > > > > > It seems to me that they probably could be 'contextual' keywords > > > i.e. > > they > > > > > > could still be used as ordinary identifiers in the same package > > > or even > > > within the same function (though the latter wouldn't be a great > > > idea > > from a > > > > > > readability perspective). > > > > > > Considering first 'handle' which must be the first word in a line > > > and > > then > > > > > > be followed by an identifier. It cannot be any of the following: > > > > > > 1. A function call because its not followed by (. > > > > > > 2. An assignment because it's not followed by an =, := or , > > > token. > > > > > > 3. An indexation expression because it's not followed by [. > > > > > > 4. A struct literal because it's not (directly) followed by {. > > > > > > 5. Any other expression because it's not followed by an > > > operator. > > > > > > So can anyone think of anything else it could be? > > > > > > However, 'check' is more awkward because it's followed by an > > > expression > > (not > > > > > > an identifier) and need not be the first word in the line. If > > > the > > expression > > > > > > were bracketed or preceded by a unary operator then there would > > > be a > > > potential ambiguity with #1 or #5 respectively. > > > > > > So would it suffice for the compiler to try and interpret 'check' > > > in > > these > > > > > > situations as a 'normal' identifier and issue an error if it > > > couldn't > > but > > > > > > otherwise to interpret it as a error handling keyword? > > > > > > The error would of course be easy enough to fix but, even if > > > there are > > no > > > > > > other ambiguities, would it just be too confusing and should we > > > simply > > > accept that 'check' has to be a 'full' keyword as the design > > > stands? > > I think that if a package does define `check` as a local function, > > then making contextual choices about whether `check` in an > > expression > > refers to the function or to the error checking behavior can only > > be > > confusing. > > > > One approach that could perhaps work--and I'm not at all endorsing > > this, just pointing it out--is that if a package defines `check` as > > a > > local name of any sort, the compiler could simply disable the > > error > > checking behavior of `check`. That is, `check` would only be a > > keyword if there were no local definition of `check`. > > > > Ian > > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.