[erlang-questions] Bug ?!
Richard A. O'Keefe
ok@REDACTED
Wed Oct 11 02:03:43 CEST 2006
> Remember that the set of operator-like tokens in Prolog is open,
> not closed as it is in Erlang, and I was talking about Prolog.
Ah. That was a Prolog feature that I was not aware of. (Tried briefly to
google for some more details about this, but failed. Got a reference?)
Any Prolog manual. Look for op/3.
The SWI Prolog manual is available for free download (SWI is open source).
> The only variant that was implemented was this:
>
> <list> ::= '[' ']'
> | '[' <term> <rest-list>
> <rest-list> ::= ']'
> | ',' '..' <term> ']'
> | ',' <term> <rest-list>
Ok, that was not as general as I first thought. I still think it was too
much, though: a pattern that has a matching cost proportional to the
size of the input, rather than only to the size of the pattern, is a too
powerful primitive (in my opinion)
I don't know how this misunderstanding arose. I thought I said quite
explicitly before that ", .." was the old spelling for "|". The pattern
[X,Y,..Z] in DEC-10 Prolog meant *precisely* the same as [X,Y|Z].
It certainly didn't check that Z was a list. (It couldn't: in Prolog
that would have required pattern matching to be able to *generate* the
infinite set of lists.)
There is one lingering trace of ",.." in ISO Prolog, and that is the
"univ" predicate (=..)/2.
> Now you are going to confuse the people who expect [X,..,Z] to work.
Not much, I don't think, if the basic rule is that patterns do
not seek.
You expect beginners to know that there _is_ such a rule?
It's not an obvious feature of a pattern language; Unix wildcard filenames
have no such rule, and the pattern matching language in Interlisp didn't.
(My first abandoned Prolog project was a translator from Interlisp list
patterns to Prolog patterns. By the time I understood the relationship
between the two well enough, I found that I no longer wanted it!)
> Changing "|_" to ",.." would trade 6118 shifted keypresses for
> 9342 unshifted keypresses. This would indeed reduce the number of
> shifted keypresses by about two and a half percent, but since only about
> 1 keypress in 8 is shifted, that's not a big saving overall.
Ah, but you didn't count the number of extra keypresses needed to delete
the mistyped character and try it again from a different key. :-)
No, because that is unknowable, and in my experience, close to 0.
Clearly your experience, with a different keyboard, is different.
> The point of the [*], {*}, <<*>> proposal was to have a simple way to
> say something that _cannot_ be currently said in a pattern, at least for
> [*] and {*}.
Yes, that would still be useful (at least for tuples). I just find it
unfortunate to use * for that purpose in a proper programming language -
it drags in horrible command shell connotations that put a shiver up my
spine.
The connotation it drags in for me is "Kleene closure" (think "* in regular
expressions"), which is exactly right.
What semantics did you have in mind for '[*]' (in Erlang)? The
is_list(X) test only checks for is-cons-or-nil. Should [*]/[..] be a
synonym, or did you imagine it as checking for proper list-ness?
To put it another way, should
f(X = [*]) -> g(X).
have the effect of
f(X) when is_list(X) -> g(X).
or of
f(X) when length(X) >= 0 -> g(X).
If Erlang didn't already have length() in guards, I would be
feeling awkward about introducing a kind of pattern that could take
a long time. (Mind you, f(X, X) can ALSO take a long time.)
In cases where I would like to use [*], I would be processing all the
elements later on (or at any rate touching all the cells), so the
cost would pay off. I have always felt that is_list(X) is a very
misleading way to express is_empty_or_a_pair(X). So
[*] in a pattern is equivalent to
X in the pattern and
length(X) >= 0 added to the guard.
More information about the erlang-questions
mailing list