[erlang-questions] I think I wish I could write case Any of whatever -> _ end.

Bengt Kleberg bengt.kleberg@REDACTED
Wed May 19 07:08:49 CEST 2010


I think this is the short paper by Schmidt and Lampson:
http://research.microsoft.com/en-us/um/people/blampson/32-organizingsoftware/32-organizingsoftwareocr.doc

Unfortunately it is unavailable there, but there is a cache:
http://webcache.googleusercontent.com/search?q=cache:YMjF4RmG6BEJ:http://research.microsoft.com/en-us/um/people/blampson/32-organizingsoftware/32-organizingsoftwareocr.doc+cedar+Eric+Schmidt+system+model&hl=&ct=clnk


bengt

On Wed, 2010-05-19 at 04:41 +0200, Richard O'Keefe wrote:
> On May 18, 2010, at 3:05 PM, Henning Diedrich wrote:
> 
> > Richard, righteous,
> >
> > I was just curious about the defense you'd mount to keep ~ for the  
> > frame syntax.
> >
> > Where the first thing that hit my uneducated I was how the use of ~  
> > in it was so completely special --- as some other symbol uses in  
> > Erlang are --- that it, well, may be an excellent fit. Why starting  
> > to get conventional. A language proudly flying =< could also have ~  
> > to mean 'something like' while really, yes, significantly different  
> > from =.
> 
> I am baffled by this "so completely special" claim.
> The frames report goes to some trouble to point out that this use of
> ~ for maplets is *NOT* innovative.  It was a straight steal from
> Xerox PARC.  The Mesa programming language had an equivalent of
> 'make' called C/Mesa.  For Mesa's successor Cedar, this was replaced
> by Eric Schimdt's "System Modeller", which took care of
>   - versions
>   - building
>   - distribution
> using a "system model" (think "Makefile on steroids") which was nothing
> other than a pure lazy functional program for building systems.  (This
> is the same Eric Schmidt who became CEO of Google.)  A lovely idea,
> and anyone thinking about configuring, building, distributing, and
> installing Erlang systems really ought to spend some time reading
> Schmidt's thesis.  (Or at least the short paper about it by him and
> Butler Lampson, which is a little easier to find.)
> 
> Which is where I got "~" from.  Pebble and SML (System Modelling
> Language) come from the same stable.  Pebble was mainly used as a
> formal notation for specifying Cedar, but it _was_ implemented.
> So "~" has been used in at least two functional languages.
> 
> And it *does* standardly mean "sort of like =".  I grant you that in
> Haskell it means "match this pattern lazily", and in ML it means
> "negative sign" as part of a numeric literal, and in C, bizarrely,
> it means "bitwise complement", but all of those are *unary* uses.
> See for example http://mathworld.wolfram.com/Tilde.html.
> 
> The other thing that might make sense would be ":=" (is defined as),
> although that would tend to confuse people used to sane programming
> languages that don't use = for assignment.  (Fortran has much to
> answer for.  FORmula TRANslator, yet they used .EQ. for equality?)
> 
> As for =<, that wasn't really a matter of choice.  Prolog was used
> to manipulate logical expressions, and desperately needed <= and =>
> for free use as arrows, forcing equals-or-less than to be written
> =<.  Parlog, FCP, GHC, and Strand 88 all followed it.  The first
> implementation of Erlang was in Prolog.  Hence much of Erlang
> syntax.  But not all of it by any means.  Erlang *has* innovated.
> Just not *there*.
> 
> 
> >
> > I think I already got used to the proposed frame syntax, followed  
> > your arguments and support it.
> >
> > But I think ~ would be great to also roughly mean 'what I just  
> > said'. Also ./. might do, or -"-, or *.
> 
> It is extremely difficult to believe that this is not an elaborate
> practical joke.
> 
> As it happens, I _have_ used a programming language in which * could be
> used in much that way:  Burroughs Extended Algol.  From the 1977 manual,
> page 5-6:
> 	Pragmatics
> 	An "update assignment" can be specified with an asterisk (*)
> 	after the colon equal (:=) by an assignment to an
> 	<arithmetic variable> whose <partial word part> is empty.
> 	For example, "A := *+1" produces the same results as
> 	"A := A+1".  Updating a <subscripted variable> via this
> 	method is more efficient."
> 
> It _should_ have been in the syntax, not the pragmatics.
> It was more efficient because it only evaluated the subscripts once.
> 
> I was always rather annoyed because this wasn't consistently carried
> out:
> 	BA[I] := NOT *		not allowed
> 	RA[I] := * - 1		allowed
> 	RA[I] := 1 - *		not allowed
> Note that
> 	RA[I] := * * Y + Z
> is _not_ like C's ra[i] *= y+z, but like ra[i] = (ra[i]*y)+z.
> 
> That taught me to beware of "what I just said".
> 
> I mentioned Common Lisp's REPL.  SML has something similar:
> 	% sml
> 	- 6*7;
> 	val it = 42 : int
> 	- it div 3;
> 	val it = 14 : int
> Now we have two definitions of "it", the later one hiding the
> earlier.  Want to refer to the earlier?  You're stuffed.
> 
> A SINGLE "WHAT-I-JUST-SAID" IS A BAD IDEA NO MATTER HOW YOU SPELL IT.
> 
> If you are sharp-witted and realise that you need to save a value,
> you can quickly name it:
> 
> 	- val planets = it;
> 	val planets = 14 : int
> 	- 72;
> 	val it = 72 : int
> 	- planets;
> 	val it = 14 : int
> 
> In the same way, the S programming language allows assignment to
> be written right-to-left
> 	var <- expr
> or left-to-right
> 	expr -> var
> so that if you've just typed a hairy long expression and realise
> that you'll need to refer to the value again, you can tack an
> assignment on the end without retyping the whole thing.
> 
> The problem is that we need to *think* about our programs, to take
> bits of them, manipulate them, put them back, turn them inside out
> and run them backwards, in a very fluid way.
> 
> But a "what I just said" is tightly bound to its context.
> It's not just in a particular place, it's coated with thick
> layers of superglue, nailed fast, and anchored with a thick
> chain.  Sure, if an expression in an arm of a case refers to
> a variable bound in the pattern of that arm, it still needs
> that variable, but it *SAYS* what variable it needs.
> 
> > The argument about being hard to pronounce sounds a bit convenient  
> > in this context. Pronouncing code is a rarified art and runs into  
> > this problem time again.
> 
> "Rarefied" (note spelling) means "thin", as in the opposite of
> "condensed".  As for pronouncing code, it SHOULDN'T be an esoteric
> art.  We do, after all, TALK about our programs with each other.
> What do we do?  Point and grunt?  I have a tongue and I'm not scared
> to use it in the service of my profession.  "The telephone test" is
> not of my invention.
> 
> Here's an example of an error due to the pronunciation of
> characters:
> 	~1
> is the ML way to write what you get by subtracting 1 from 0.
> If you *pronounce* it "negative one", well and good.  Any ML
> programmer who has got past the tyro stage will get it right.
> But if you *pronounce* it "minus one", you will far too often
> write
> 	-1
> which is a syntax error, if you are lucky.  For
> 	f x ~1
> means (f (x))(~1), while
> 	f x -1
> means (op -)(f x, 1).  The only way I ever found to cure myself
> of this was to religiously say "negative one".  (The same applies
> in APL, where the "high minus" character is used for "negative".)
> 
> > But just as '=' can mean many things to different people, maybe '~'  
> > can be used for both things.
> 
> = has three principal uses in programming languages:
>     query: is this equal to that?
>     definition: this is equal to that, now and always!
>     command: change this to be equal to that (at the moment).
> "Equal" is in all of them.
> 
> Maybe ~ *could* be used to mean "what I just said" or "the price
> of fish in Port Stanley last Thursday" or "this CPU's current clock
> frequency".  Heck, we could even use it to replace self(), which
> would benefit from not being a function call.  That doesn't make
> any of these a good idea.
> 
> > I thought it was a tad illogical, however, to argue that because  
> > there is no obviousness to the meaning of <<< in Lisp might indicate  
> > that the 'some as above/before' connotation of ~ should likewise and  
> > somehow guilty by association be irrelevant or even  
> > counterproductive when deciding about. It's use.
> 
> What I was arguing was perfectly logical: a hack can be turned into a
> principle if you repeat it *consistently*, but the Lisp * ** ***
> convention is not repeated *consistently*.  (The key one was not the
> missing <<< but the missing -- and --- .)
> 
> To put it another way: you *can* demand that people learn some weird
> new convention, BUT you have to make it pay off for them.  Isolated
> hacks don't pay off for your readers.
> 
> > Not that I believe that anyone cares, but eye have a hobby horse  
> > that had me thinking about hacking the pre-compiler already: the  
> > doubling of function signatures where the variation that is called  
> > in the former is, plus one default argument as literal, exactly the  
> > head of the next. I might be doing something wrong there but I keep  
> > copying heads and it makes the code hard to read. I regularily go,  
> > copy a head, paste it three times (one over the old ) and alter two  
> > of them marginally. A nice remedy could be:
> >
> > Fun(A) -> Fun(A, b).
> >
> > Fun(A,B) ...
> 
> Believe it or not, but this is covered by an old proposal of mine.
> My adaptation of Paul Lyons' "split procedure heads" covers both
> keywords and optional arguments.
> 
> Lisp has	(defun f (a (&optional b 'B)) ...)
> S (R) has	f <- function (a, b = "B") { ... }
> Ada has		function F(A : T1; B: T2 => "B") is ...
> C++ has		T0 f(T1 a, T2 b = 'b') { ... }
> 
> Notice a pattern about where the default value goes?
> \
> >
> > This could become
> >
> > Fun(A) -> ~~ b.
> 
> That puts the default value where the body belongs,
> and means that you only get ONE default argument.
> Two strikes against it to start with.
> 
> If I wanted this often, I might use M4, and define
> 
> optional(HEAD, E1, ..., En)
> 
> to expand to
> 
> 	HEAD') -> HEAD'(E1).
> 	HEAD' _V_1) -> HEAD' _V_1, E2).
> 	...
> 	HEAD' _V_1, ..., V_n_minus_1) -> HEAD' (_V_1, ..., _V_n_minus_1, En).
> 
> where HEAD' is HEAD without its trailing ),
> which would be a pretty trivial piece of M4 code, but would
> let you write
> 
> optional(foobar(A,B), A+2, 42).
> foobar(A, B, C, D) -> ...
> 
> and have it expand to
> 
> 	foobar(A,B) -> foobar(A,B, A+2).
> 	foobar(A,B, _V_1) -> foobar(A,B, _V_1, 42).
> 	foobar(A, B, C, D) -> ...
> 
> Hmm.  I don't quite like that interface.  Maybe
> 
> optional(F(A1, ..., An))
> 
> where Ai is either Var or Var=>Expr
> 
> optional(foobar(A, B=>A+2, C, D=>A*B+C))
> 
> That looks like it might work.  I did use a special symbol here,
> but (note again the absence of innovation) it's the same one Ada
> uses.  Come to think of it, since Ada uses => for records as well
> as optional parameters, it would make sense to use the same
> symbol in Erlang, and use Var ~ Expr for defaults.
> 
> Last draft today:
> 
> optional(foobar(A, B ~ A+2, C, D ~ A*B+C))
> 
> In any case, no actual change to Erlang is involved.
> It would also be possible to hack on the Erlang parser
> to recognise
> -optional foobar(A, B ~ A+2, C, D ~ A*B+C).
> but I'd want to prototype it with M4.
> 
> >
> > Sorry there is no relation to the negation connotation that ~  
> > somehow brings along. But that seemed to be alright for its use in  
> > io:format in the first place, didn't it? Also, somehow, it negates  
> > writing code doubly.
> 
> If you're a C programmer, sure, ~ says bitwise negation.
> In Lisp, it doesn't.  Not even close.  And that's where 'format'
> comes from.  (Possibly via Prolog.)  In _Erlang_, the only use
> of "~" is in formats, and there isn't the slightest whiff of
> negation about it anywhere.
> 
> 
> 
> ________________________________________________________________
> erlang-questions (at) erlang.org mailing list.
> See http://www.erlang.org/faq.html
> To unsubscribe; mailto:erlang-questions-unsubscribe@REDACTED
> 



More information about the erlang-questions mailing list