<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=US-ASCII">
<META NAME="Generator" CONTENT="MS Exchange Server version 5.5.2654.45">
<TITLE>RE: [ANN] [UPDATES] Squeak 3.4 now in beta</TITLE>
</HEAD>
<BODY>
<BR>
<P><FONT SIZE=2>Hello.</FONT>
</P>
<P><FONT SIZE=2>> Oh dear. The Unix guys really have been far-sighted when they created (or maybe adopted) the single-rooted path name hierarchy. It's _so_ much simpler to use than everything else out there ... No wonder it was adopted for URLs, too. Can't we just do the same? That is, use Unix/URL-like notation in the image and let the VM worry about mapping that to platform path names?</FONT></P>
<P><FONT SIZE=2>It's simple and homogeneous. Of course it should work, as opposed to Java's 59 reserved words.</FONT>
</P>
<P><FONT SIZE=2>Here's something that just crossed my mind. Make / a binary message. So /usr/bin/gcc/gcc becomes:</FONT>
</P>
<P> <FONT SIZE=2>Root / 'usr' / 'bin' / 'gcc' / 'gcc'</FONT>
</P>
<P><FONT SIZE=2>To have extra meaningfulness without resorting to parentheses, use keyword messages:</FONT>
</P>
<P> <FONT SIZE=2>Root / 'usr' / 'bin' / 'gcc' streamForFileNamed: 'gcc'</FONT>
<BR> <FONT SIZE=2>Root / 'usr' / 'bin' / 'gcc' hasFileNamed: 'gcc'</FONT>
<BR> <FONT SIZE=2>Root / 'usr' / 'bin' hasFolderNamed: 'gcc'</FONT>
<BR> <FONT SIZE=2>Root foldersDo: aBlock</FONT>
</P>
<P><FONT SIZE=2>The pattern is to use binary messages to aggregate and keyword ones to actually do something when you reach the point of interest. The keyword selectors would have to be extremely well chosen.</FONT></P>
<P><FONT SIZE=2>Now I also realize that Root could just be the empty string which would indicate absolute names, as opposed to names whose first component is not empty hence they're relative.</FONT></P>
<P><FONT SIZE=2>In my experience, applying this pattern to blocks and the binary comma message produces interesting things such as</FONT>
</P>
<P> <FONT SIZE=2>[x], [y], [z]</FONT>
<BR> <FONT SIZE=2>ifAllTrue:</FONT>
<BR> <FONT SIZE=2>ifAnyTrue:</FONT>
<BR> <FONT SIZE=2>otherwise:</FONT>
</P>
<P><FONT SIZE=2>Or (remember nil class == UndefinedObject):</FONT>
</P>
<P> <FONT SIZE=2>[x], [y], [z]</FONT>
<BR> <FONT SIZE=2>ifAllDefined:</FONT>
<BR> <FONT SIZE=2>ifAnyDefined:</FONT>
<BR> <FONT SIZE=2>otherwise:</FONT>
</P>
<P><FONT SIZE=2>Not to mention</FONT>
</P>
<P><FONT SIZE=2>isWhatever</FONT>
<BR> <FONT SIZE=2>"^(x1 or: [x2]) or: [y1 and: [y2]]"</FONT>
</P>
<P> <FONT SIZE=2>^[x1], [x2] orAllOf: [y1], [y2]</FONT>
</P>
<P><FONT SIZE=2>Note how parentheses, nesting, and superfluous logical connectors are eliminated. It works really well.</FONT>
</P>
<P><FONT SIZE=2>Andres.</FONT>
</P>
</BODY>
</HTML>