%!PS-Adobe-2.0 %%BoundingBox: 0 0 640 480 %%Version: 0.1 %%DocumentFonts: (atend) %%Pages: (atend) %%EndComments % % Version 3.3.2 prologue for troff files. % /#copies 1 store /aspectratio 1 def /formsperpage 1 def /landscape false def /linewidth .3 def /magnification 1 def /margin 0 def /orientation 0 def /resolution 720 def /rotation 1 def /xoffset 0 def /yoffset 0 def /roundpage true def /useclippath true def /pagebbox [0 0 612 792] def /R /Times-Roman def /I /Times-Italic def /B /Times-Bold def /BI /Times-BoldItalic def /H /Helvetica def /HI /Helvetica-Oblique def /HB /Helvetica-Bold def /HX /Helvetica-BoldOblique def /CW /Courier def /CO /Courier def /CI /Courier-Oblique def /CB /Courier-Bold def /CX /Courier-BoldOblique def /PA /Palatino-Roman def /PI /Palatino-Italic def /PB /Palatino-Bold def /PX /Palatino-BoldItalic def /Hr /Helvetica-Narrow def /Hi /Helvetica-Narrow-Oblique def /Hb /Helvetica-Narrow-Bold def /Hx /Helvetica-Narrow-BoldOblique def /KR /Bookman-Light def /KI /Bookman-LightItalic def /KB /Bookman-Demi def /KX /Bookman-DemiItalic def /AR /AvantGarde-Book def /AI /AvantGarde-BookOblique def /AB /AvantGarde-Demi def /AX /AvantGarde-DemiOblique def /NR /NewCenturySchlbk-Roman def /NI /NewCenturySchlbk-Italic def /NB /NewCenturySchlbk-Bold def /NX /NewCenturySchlbk-BoldItalic def /ZD /ZapfDingbats def /ZI /ZapfChancery-MediumItalic def /S /S def /S1 /S1 def /GR /Symbol def /inch {72 mul} bind def /min {2 copy gt {exch} if pop} bind def /setup { counttomark 2 idiv {def} repeat pop landscape {/orientation 90 orientation add def} if /scaling 72 resolution div def linewidth setlinewidth 1 setlinecap pagedimensions xcenter ycenter translate orientation rotation mul rotate width 2 div neg height 2 div translate xoffset inch yoffset inch neg translate margin 2 div dup neg translate magnification dup aspectratio mul scale scaling scaling scale addmetrics 0 0 moveto } def /pagedimensions { useclippath userdict /gotpagebbox known not and { /pagebbox [clippath pathbbox newpath] def roundpage currentdict /roundpagebbox known and {roundpagebbox} if } if pagebbox aload pop 4 -1 roll exch 4 1 roll 4 copy landscape {4 2 roll} if sub /width exch def sub /height exch def add 2 div /xcenter exch def add 2 div /ycenter exch def userdict /gotpagebbox true put } def /addmetrics { /Symbol /S null Sdefs cf /Times-Roman /S1 StandardEncoding dup length array copy S1defs cf } def /pagesetup { /page exch def currentdict /pagedict known currentdict page known and { page load pagedict exch get cvx exec } if } def /decodingdefs [ {counttomark 2 idiv {y moveto show} repeat} {neg /y exch def counttomark 2 idiv {y moveto show} repeat} {neg moveto {2 index stringwidth pop sub exch div 0 32 4 -1 roll widthshow} repeat} {neg moveto {spacewidth sub 0.0 32 4 -1 roll widthshow} repeat} {counttomark 2 idiv {y moveto show} repeat} {neg setfunnytext} ] def /setdecoding {/t decodingdefs 3 -1 roll get bind def} bind def /w {neg moveto show} bind def /m {neg dup /y exch def moveto} bind def /done {/lastpage where {pop lastpage} if} def /f { dup /font exch def findfont exch dup /ptsize exch def scaling div dup /size exch def scalefont setfont linewidth ptsize mul scaling 10 mul div setlinewidth /spacewidth ( ) stringwidth pop def } bind def /changefont { /fontheight exch def /fontslant exch def currentfont [ 1 0 fontheight ptsize div fontslant sin mul fontslant cos div fontheight ptsize div 0 0 ] makefont setfont } bind def /sf {f} bind def /cf { dup length 2 idiv /entries exch def /chtab exch def /newencoding exch def /newfont exch def findfont dup length 1 add dict /newdict exch def {1 index /FID ne {newdict 3 1 roll put}{pop pop} ifelse} forall newencoding type /arraytype eq {newdict /Encoding newencoding put} if newdict /Metrics entries dict put newdict /Metrics get begin chtab aload pop 1 1 entries {pop def} for newfont newdict definefont pop end } bind def % % A few arrays used to adjust reference points and character widths in some % of the printer resident fonts. If square roots are too high try changing % the lines describing /radical and /radicalex to, % % /radical [0 -75 550 0] % /radicalex [-50 -75 500 0] % % Move braceleftbt a bit - default PostScript character is off a bit. % /Sdefs [ /bracketlefttp [201 500] /bracketleftbt [201 500] /bracketrighttp [-81 380] /bracketrightbt [-83 380] /braceleftbt [203 490] /bracketrightex [220 -125 500 0] /radical [0 0 550 0] /radicalex [-50 0 500 0] /parenleftex [-20 -170 0 0] /integral [100 -50 500 0] /infinity [10 -75 730 0] ] def /S1defs [ /underscore [0 80 500 0] /endash [7 90 650 0] ] def % % Version 3.3.2 drawing procedures for dpost. Automatically pulled in when % needed. % /inpath false def /savematrix matrix def /Dl { inpath {neg lineto pop pop} {newpath neg moveto neg lineto stroke} ifelse } bind def /De { /y1 exch 2 div def /x1 exch 2 div def /savematrix savematrix currentmatrix def neg exch x1 add exch translate x1 y1 scale 0 0 1 0 360 inpath {1 0 moveto arc savematrix setmatrix} {newpath arc savematrix setmatrix stroke} ifelse } bind def /Da { /dy2 exch def /dx2 exch def /dy1 exch def /dx1 exch def dy1 add neg exch dx1 add exch dx1 dx1 mul dy1 dy1 mul add sqrt dy1 dx1 neg atan dy2 neg dx2 atan inpath {arc} {newpath arc stroke} ifelse } bind def /DA { /dy2 exch def /dx2 exch def /dy1 exch def /dx1 exch def dy1 add neg exch dx1 add exch dx1 dx1 mul dy1 dy1 mul add sqrt dy1 dx1 neg atan dy2 neg dx2 atan inpath {arcn} {newpath arcn stroke} ifelse } bind def /Ds { /y2 exch def /x2 exch def /y1 exch def /x1 exch def /y0 exch def /x0 exch def x0 5 x1 mul add 6 div y0 5 y1 mul add -6 div x2 5 x1 mul add 6 div y2 5 y1 mul add -6 div x1 x2 add 2 div y1 y2 add -2 div inpath {curveto} {newpath x0 x1 add 2 div y0 y1 add -2 div moveto curveto stroke} ifelse } bind def % % Tries to round clipping path dimensions, as stored in array pagebbox, so they % match one of the known sizes in the papersizes array. Lower left coordinates % are always set to 0. % /roundpagebbox { 7 dict begin /papersizes [8.5 inch 11 inch 14 inch 17 inch] def /mappapersize { /val exch def /slop .5 inch def /diff slop def /j 0 def 0 1 papersizes length 1 sub { /i exch def papersizes i get val sub abs dup diff le {/diff exch def /j i def} {pop} ifelse } for diff slop lt {papersizes j get} {val} ifelse } def pagebbox 0 0 put pagebbox 1 0 put pagebbox dup 2 get mappapersize 2 exch put pagebbox dup 3 get mappapersize 3 exch put end } bind def %%EndProlog %%BeginSetup mark % % Encoding vector and redefinition of findfont for the ISO Latin1 standard. % The 18 characters missing from ROM based fonts on older printers are noted % below. % /ISOLatin1Encoding [ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright /parenleft /parenright /asterisk /plus /comma /minus /period /slash /zero /one /two /three /four /five /six /seven /eight /nine /colon /semicolon /less /equal /greater /question /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o /p /q /r /s /t /u /v /w /x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space /exclamdown /cent /sterling /currency /yen /brokenbar % missing /section /dieresis /copyright /ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree % missing /plusminus % missing /twosuperior % missing /threesuperior % missing /acute /mu % missing /paragraph /periodcentered /cedilla /onesuperior % missing /ordmasculine /guillemotright /onequarter % missing /onehalf % missing /threequarters % missing /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth % missing /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply % missing /Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute % missing /Thorn % missing /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis /eth % missing /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide % missing /oslash /ugrave /uacute /ucircumflex /udieresis /yacute % missing /thorn % missing /ydieresis ] def /NewFontDirectory FontDirectory maxlength dict def % % Apparently no guarantee findfont is defined in systemdict so the obvious % % systemdict /findfont get exec % % can generate an error. So far the only exception is a VT600 (version 48.0). % userdict /@RealFindfont known not { userdict begin /@RealFindfont systemdict begin /findfont load end def end } if /findfont { dup NewFontDirectory exch known not { dup %dup systemdict /findfont get exec % not always in systemdict dup userdict /@RealFindfont get exec dup /Encoding get StandardEncoding eq { dup length dict begin {1 index /FID ne {def}{pop pop} ifelse} forall /Encoding ISOLatin1Encoding def currentdict end /DummyFontName exch definefont } if NewFontDirectory 3 1 roll put } if NewFontDirectory exch get } bind def setup %%EndSetup %%Page: 1 1 /saveobj save def mark 1 pagesetup gsave 1 1 .93 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -4800 rlineto -6400 0 rlineto closepath fill grestore 36 /LucidaSans-Typewriter83 f (rscc) 1016 780 w 36 /Times-Bold f (:) 1736 780 w (an) 1945 780 w (extensible compiler) 2417 780 w 28 /Times-Roman f (Russ Cox) 2658 1420 w (Frans Kaashoek) 2304 1740 w (Eddie Kohler) 2451 2060 w (PDOS) 1948 3020 w (Group Meeting) 2736 3020 w (January 24, 2006) 2241 3340 w 28 /LucidaSans-Typewriter83 f (http://swtch.com/~rsc/talks/) 1240 4300 w cleartomark showpage saveobj restore %%EndPage: 1 1 %%Page: 2 2 /saveobj save def mark 2 pagesetup gsave 1 1 .93 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -4800 rlineto -6400 0 rlineto closepath fill grestore gsave .93 .93 1 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -350 rlineto -6400 0 rlineto closepath fill grestore 22 /Times-Bold f (Problem) 200 220 w (\(big picture\)) 1061 220 w 0 0 0 setrgbcolor 24 /Times-Roman f (Programs) 200 740 w (are) 1179 740 w (buggy.) 1530 740 w (Because) 200 1520 w (programming languages) 1059 1520 w (don't work for you.) 3443 1520 w (You work for them.) 200 2300 w (How) 200 3080 w (do you resolve) 726 3080 w (mismatch between programming task) 2198 3080 w (and language?) 200 3340 w cleartomark showpage saveobj restore %%EndPage: 2 2 %%Page: 3 3 /saveobj save def mark 3 pagesetup gsave 1 1 .93 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -4800 rlineto -6400 0 rlineto closepath fill grestore gsave .93 .93 1 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -350 rlineto -6400 0 rlineto closepath fill grestore 22 /Times-Bold f (Outline) 200 220 w 0 0 0 setrgbcolor 24 /Times-Roman f (Problem ) 200 740 w 24 /LucidaSansUnicode20 f (\023) 1073 740 w 24 /Times-Roman f (5 slides) 1253 740 w (Specific) 200 1260 w (Extensions) 1045 1260 w 24 /LucidaSansUnicode20 f (\023) 2159 1260 w 24 /Times-Roman f (10 slides) 2339 1260 w (How) 200 1780 w (to Implement) 726 1780 w 24 /LucidaSans-Typewriter83 f (rscc) 2072 1780 w 24 /Times-Roman f 24 /LucidaSansUnicode20 f (\023) 2612 1780 w 24 /Times-Roman f (10 slides) 2792 1780 w 24 /LucidaSansUnicode20 f (\023) 260 2040 w 24 /Times-Roman f (parser) 440 2040 w 24 /LucidaSansUnicode20 f (\023) 260 2300 w 24 /Times-Roman f (internal representation) 440 2300 w (Please) 200 2820 w (interrupt with questions.) 873 2820 w cleartomark showpage saveobj restore %%EndPage: 3 3 %%Page: 4 4 /saveobj save def mark 4 pagesetup gsave 1 1 .93 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -4800 rlineto -6400 0 rlineto closepath fill grestore gsave .93 .93 1 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -350 rlineto -6400 0 rlineto closepath fill grestore 22 /Times-Bold f (Good Languages?) 200 220 w 0 0 0 setrgbcolor 24 /Times-Roman f (Some) 200 740 w (languages) 807 740 w (make) 1826 740 w (some) 2405 740 w (bugs) 2972 740 w (easier to avoid / find.) 3486 740 w 24 /LucidaSansUnicode20 f (\023) 200 1260 w 24 /Times-Roman f (good abstractions) 380 1260 w 24 /LucidaSansUnicode20 f (\023) 200 1780 w 24 /Times-Roman f (type) 380 1780 w (systems) 853 1780 w (Never good enough.) 200 2560 w (People) 200 2820 w (extend languages) 913 2820 w (any way they can.) 2631 2820 w 24 /LucidaSansUnicode20 f (\023) 200 3340 w 24 /Times-Roman f (C) 380 3340 w (preprocessor \(easy, but rarely good\)) 601 3340 w 24 /LucidaSansUnicode20 f (\023) 200 3860 w 24 /Times-Roman f (custom preprocessors) 380 3860 w (\(good, but rarely easy\)) 2511 3860 w 24 /LucidaSansUnicode20 f (\023) 200 4380 w 24 /Times-Roman f (custom checkers) 380 4380 w cleartomark showpage saveobj restore %%EndPage: 4 4 %%Page: 5 5 /saveobj save def mark 5 pagesetup gsave 1 1 .93 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -4800 rlineto -6400 0 rlineto closepath fill grestore gsave .93 .93 1 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -350 rlineto -6400 0 rlineto closepath fill grestore 22 /Times-Bold f (Useful) 200 220 w (Preprocessors) 854 220 w 0 0 0 setrgbcolor 24 /Times-Roman f (Click \(Kohler\)) 200 740 w 24 /LucidaSansUnicode20 f (\023) 260 1000 w 24 /Times-Roman f (language) 440 1000 w (to describe) 1365 1000 w (module) 2470 1000 w (properties, router configs) 3250 1000 w (Tame) 200 1780 w (\(Krohn\)) 805 1780 w 24 /LucidaSansUnicode20 f (\023) 260 2040 w 24 /Times-Roman f (more) 440 2040 w (convenient syntax for libasync) 992 2040 w 24 /LucidaSansUnicode20 f (\023) 260 2300 w 24 /Times-Roman f (\(Even) 440 2300 w 24 /Times-Italic f (I) 1071 2300 w 24 /Times-Roman f (can write) 1210 2300 w (tame) 2154 2300 w (programs!\)) 2680 2300 w (Ace) 200 3080 w (\(Gosling\)) 645 3080 w 24 /LucidaSansUnicode20 f (\023) 260 3340 w 24 /Times-Roman f (syntax\255based preprocessor, used for bitblt) 440 3340 w (QT Rewriter) 200 4120 w (\255 used for simpler event syntax in QT library) 260 4380 w cleartomark showpage saveobj restore %%EndPage: 5 5 %%Page: 6 6 /saveobj save def mark 6 pagesetup gsave 1 1 .93 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -4800 rlineto -6400 0 rlineto closepath fill grestore gsave .93 .93 1 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -350 rlineto -6400 0 rlineto closepath fill grestore 22 /Times-Bold f (Useful) 200 220 w (Checkers) 854 220 w 0 0 0 setrgbcolor 24 /Times-Roman f (Magik \(Engler\)) 200 740 w 24 /LucidaSansUnicode20 f (\023) 260 1000 w 24 /Times-Roman f (checking of flow\255sensitive) 440 1000 w (conditions, using xgcc) 3043 1000 w 24 /LucidaSansUnicode20 f (\023) 260 1260 w 24 /Times-Roman f (more) 440 1260 w (recent work about guessing things) 992 1260 w (to check) 4330 1260 w (Uno \(Holzmann\)) 200 2040 w 24 /LucidaSansUnicode20 f (\023) 260 2300 w 24 /Times-Roman f (another static) 440 2300 w (checker, actually available.) 1785 2300 w (Sparse) 200 3080 w (\(Torvalds\)) 899 3080 w 24 /LucidaSansUnicode20 f (\023) 260 3340 w 24 /Times-Roman f (add annotations) 440 3340 w (to Linux source) 2013 3340 w (for lock/unlock pairing,) 3578 3340 w (kernel/user address) 440 3600 w (spaces) 2343 3600 w cleartomark showpage saveobj restore %%EndPage: 6 6 %%Page: 7 7 /saveobj save def mark 7 pagesetup gsave 1 1 .93 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -4800 rlineto -6400 0 rlineto closepath fill grestore gsave .93 .93 1 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -350 rlineto -6400 0 rlineto closepath fill grestore 22 /Times-Bold f (Implementation Techniques) 200 220 w 0 0 0 setrgbcolor 24 /Times-Roman f (Start from scratch) 200 1000 w 24 /LucidaSansUnicode20 f (\023) 260 1260 w 24 /Times-Roman f (lots) 440 1260 w (and lots) 848 1260 w (of work, requires) 1662 1260 w (knowing about compilers) 3364 1260 w (Edit an existing compiler) 200 2300 w 24 /LucidaSansUnicode20 f (\023) 260 2560 w 24 /Times-Roman f (lots) 440 2560 w (of work, requires) 848 2560 w (knowing about compilers,) 2550 2560 w (requires) 440 2820 w 24 /Times-Italic f (knowing) 1271 2820 w 24 /Times-Roman f (that particular compiler) 2145 2820 w cleartomark showpage saveobj restore %%EndPage: 7 7 %%Page: 8 8 /saveobj save def mark 8 pagesetup gsave 1 1 .93 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -4800 rlineto -6400 0 rlineto closepath fill grestore gsave .93 .93 1 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -350 rlineto -6400 0 rlineto closepath fill grestore 22 /Times-Bold f (Problem) 200 220 w (\(recap\)) 1061 220 w 0 0 0 setrgbcolor 24 /Times-Roman f (Programs) 200 1000 w (are) 1179 1000 w (buggy.) 1530 1000 w (Because) 200 1520 w (languages) 1059 1520 w (aren't good for programming.) 2078 1520 w (Lots) 200 2560 w (of good can come) 687 2560 w (from tailoring the) 2457 2560 w (language.) 4208 2560 w (But it's) 200 3080 w (far too much work for most programmers.) 975 3080 w (How) 200 4120 w (can we) 726 4120 w (lower the) 1457 4120 w (bar?) 2415 4120 w cleartomark showpage saveobj restore %%EndPage: 8 8 %%Page: 9 9 /saveobj save def mark 9 pagesetup gsave 1 1 .93 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -4800 rlineto -6400 0 rlineto closepath fill grestore gsave .93 .93 1 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -350 rlineto -6400 0 rlineto closepath fill grestore 22 /Times-Bold f (Solution:) 200 220 w (Extensible) 1114 220 w (Compiler) 2149 220 w 0 0 0 setrgbcolor 24 /Times-Roman f (Extensible) 200 740 w (compiler) 1273 740 w 24 /LucidaSansUnicode20 f (\023) 260 1260 w 24 /Times-Roman f (let programmers) 440 1260 w (add extensions) 2077 1260 w (\() 3557 1260 w 24 /LucidaSans-Typewriter83 f (.so) 3636 1260 w 24 /Times-Roman f (files\)) 4056 1260 w (to the) 440 1520 w (compiler during compilation.) 1040 1520 w 24 /LucidaSansUnicode20 f (\023) 260 2040 w 24 /Times-Roman f (extensions) 440 2040 w (are) 1514 2040 w (separate) 1865 2040 w (from programs) 2709 2040 w (that use) 4199 2040 w (them) 4999 2040 w (\(think media\255player codecs\)) 440 2300 w 24 /LucidaSansUnicode20 f (\023) 260 2820 w 24 /Times-Roman f (extensions) 440 2820 w (add new) 1514 2820 w (language) 2379 2820 w (features, new) 3304 2820 w (checking) 4640 2820 w 24 /LucidaSansUnicode20 f (\023) 260 3340 w 24 /Times-Roman f (make) 440 3340 w (it easy to write) 1019 3340 w (these) 2498 3340 w (extensions) 3051 3340 w 24 /LucidaSansUnicode20 f (\023) 260 3860 w 24 /Times-Roman f (hide) 440 3860 w (compiler when possible) 913 3860 w 24 /LucidaSansUnicode20 f (\023) 260 4380 w 24 /Times-Roman f (make) 440 4380 w (compiler easy to understand) 1019 4380 w cleartomark showpage saveobj restore %%EndPage: 9 9 %%Page: 10 10 /saveobj save def mark 10 pagesetup gsave 1 1 .93 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -4800 rlineto -6400 0 rlineto closepath fill grestore gsave .93 .93 1 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -350 rlineto -6400 0 rlineto closepath fill grestore 22 /Times-Bold f (Solution:) 200 220 w (Extensible) 1114 220 w (compiler) 2149 220 w 0 0 0 setrgbcolor 24 /Times-Roman f (Extensible) 200 740 w (compiler, without extensions:) 1273 740 w 3080 1397 3080 1145 Dl 3080 1145 4160 1145 Dl 4160 1145 4160 1397 Dl 4160 1397 3080 1397 Dl 24 /LucidaSans-Typewriter83 f (rscc) 3380 1319 w 24 /Times-Roman f (C) 1124 1319 w (program) 1345 1319 w (executable) 5088 1319 w 2360 1271 2936 1271 Dl 2864 1289 2936 1271 Dl 2864 1253 2936 1271 Dl 4304 1271 4880 1271 Dl 4808 1289 4880 1271 Dl 4808 1253 4880 1271 Dl (Extensible) 200 2060 w (compiler, with one) 1273 2060 w (extension:) 3138 2060 w 3080 2977 3080 2725 Dl 3080 2725 4160 2725 Dl 4160 2725 4160 2977 Dl 4160 2977 3080 2977 Dl 24 /LucidaSans-Typewriter83 f (rscc) 3380 2899 w 24 /Times-Roman f (program) 1235 2639 w (using) 1380 2899 w (extension) 1180 3159 w (executable) 5088 2899 w 2360 2851 2936 2851 Dl 2864 2869 2936 2851 Dl 2864 2833 2936 2851 Dl 4304 2851 4880 2851 Dl 4808 2869 4880 2851 Dl 4808 2833 4880 2851 Dl (extension) 460 3849 w (source) 608 4109 w 2360 4057 2360 3805 Dl 2360 3805 3440 3805 Dl 3440 3805 3440 4057 Dl 3440 4057 2360 4057 Dl 24 /LucidaSans-Typewriter83 f (rscc) 2660 3979 w gsave newpath 3440 3175 m /inpath true def 0.9 0.9 0.9 setrgbcolor 3440 3175 3440 2923 Dl 3440 2923 4520 2923 Dl 4520 2923 4520 3175 Dl 4520 3175 3440 3175 Dl gsave eofill grestore 0 setgray stroke grestore /inpath false def (ext.so) 3620 3097 w 1640 3931 2216 3931 Dl 2144 3949 2216 3931 Dl 2144 3913 2216 3931 Dl 3584 3931 3584 3931 3980 3895 Ds 3584 3931 3980 3895 3980 3175 Ds 3980 3895 3980 3175 3980 3175 Ds 3998 3247 3980 3175 Dl 3962 3247 3980 3175 Dl cleartomark showpage saveobj restore %%EndPage: 10 10 %%Page: 11 11 /saveobj save def mark 11 pagesetup gsave 1 1 .93 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -4800 rlineto -6400 0 rlineto closepath fill grestore gsave .93 .93 1 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -350 rlineto -6400 0 rlineto closepath fill grestore 22 /Times-Bold f (Expected Uses) 200 220 w 0 0 0 setrgbcolor 24 /Times-Roman f (Extensions) 200 740 w (are) 1314 740 w (usually small \(and can start small\).) 1665 740 w (Programmers) 200 1520 w (write) 1551 1520 w (compiler extensions) 2103 1520 w (while) 200 1780 w (writing the) 793 1780 w (programs) 1899 1780 w (that use) 2864 1780 w (them.) 3664 1780 w (Project leaders) 200 2560 w (write) 1677 2560 w (compiler extensions) 2229 2560 w (to make) 200 2820 w (big project easier for others.) 1026 2820 w (Net work should be) 200 3600 w (less) 2145 3600 w (than not using extensions.) 2566 3600 w (Make) 200 4380 w (possible) 806 4380 w (the) 1654 4380 w (language) 2007 4380 w (changes) 2932 4380 w (mentioned earlier.) 3764 4380 w cleartomark showpage saveobj restore %%EndPage: 11 11 %%Page: 12 12 /saveobj save def mark 12 pagesetup gsave 1 1 .93 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -4800 rlineto -6400 0 rlineto closepath fill grestore gsave .93 .93 1 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -350 rlineto -6400 0 rlineto closepath fill grestore 22 /Times-Bold f (Example) 200 220 w (Extension:) 1087 220 w (Alef) 2146 220 w 0 0 0 setrgbcolor 20 /LucidaSans-Typewriter83 f (void) 200 500 w (primetask\(chan\(int\) c\)) 200 720 w ({) 200 940 w (chan\(int\) nc;) 600 1160 w (int i, p;) 600 1380 w (p = <-c;) 600 2040 w (print\("%d\\n", p\);) 600 2260 w (alloc nc;) 600 2480 w (task primetask\(nc\);) 600 2700 w (for\(;;\){) 600 2920 w (i = <-c;) 1000 3140 w (if\(i%p\)) 1000 3360 w (nc <-= i;) 1400 3580 w (}) 600 3800 w (}) 200 4020 w (Alef original) 900 4240 w (void) 2648 500 w (primethread\(void *arg\)) 2648 720 w ({) 2648 940 w (Channel *c, *nc;) 2968 1160 w (int i, p;) 2968 1380 w (c = arg;) 2968 1820 w (p = recvul\(c\);) 2968 2040 w (print\("%d\\n", p\);) 2968 2260 w (nc = chancreate\(sizeof\(ulong\), 0\);) 2968 2480 w (threadcreate\(primethread, nc, 1024\);) 2968 2700 w (for\(;;\){) 2968 2920 w (i = recvul\(c\);) 3288 3140 w (if\(i%p\)) 3288 3360 w (sendul\(nc, i\);) 3608 3580 w (}) 2968 3800 w (}) 2648 4020 w (C transliteration) 3348 4240 w cleartomark showpage saveobj restore %%EndPage: 12 12 %%Page: 13 13 /saveobj save def mark 13 pagesetup gsave 1 1 .93 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -4800 rlineto -6400 0 rlineto closepath fill grestore gsave .93 .93 1 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -350 rlineto -6400 0 rlineto closepath fill grestore 22 /Times-Bold f (Example) 200 220 w (Extension:) 1087 220 w (Alef) 2146 220 w 0 0 0 setrgbcolor 20 /LucidaSans-Typewriter83 f (Alef) 888 500 w (chan\(int\) nc;) 488 940 w (alloc nc;) 488 1160 w (task primetask\(nc\);) 488 1380 w (nc <-= i;) 488 1600 w (C + libthread) 3336 500 w (Channel *nc;) 2936 940 w (nc = chancreate\(sizeof\(ulong\), 0\);) 2936 1160 w (threadcreate\(primethread, nc, 1024\);) 2936 1380 w (sendul\(nc, i\);) 2936 1600 w 20 /Times-Roman f (Benefits of Alef:) 488 2180 w 20 /LucidaSansUnicode20 f (\023) 538 2440 w 20 /Times-Roman f (more concise, more readable.) 688 2440 w 20 /LucidaSansUnicode20 f (\023) 538 2700 w 20 /Times-Roman f (type\255checked channels.) 688 2700 w 20 /LucidaSansUnicode20 f (\023) 538 2960 w 20 /Times-Roman f (good thread creation syntax.) 688 2960 w 20 /LucidaSansUnicode20 f (\023) 538 3220 w 20 /Times-Roman f (good communication syntax \() 688 3220 w 20 /LucidaSans-Typewriter83 f (alt) 3070 3220 w 20 /Times-Roman f (\)) 3370 3220 w (Alef is dead.) 488 3740 w 20 /LucidaSansUnicode20 f (\023) 538 4000 w 20 /Times-Roman f (compiler author moved on.) 688 4000 w 20 /LucidaSansUnicode20 f (\023) 538 4260 w 20 /Times-Roman f (those left behind switched to C.) 688 4260 w (gave up the benefits for ease of maintenance) 688 4520 w cleartomark showpage saveobj restore %%EndPage: 13 13 %%Page: 14 14 /saveobj save def mark 14 pagesetup gsave 1 1 .93 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -4800 rlineto -6400 0 rlineto closepath fill grestore gsave .93 .93 1 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -350 rlineto -6400 0 rlineto closepath fill grestore 22 /Times-Bold f (Example) 200 220 w (Extension:) 1087 220 w (Tame) 2146 220 w 0 0 0 setrgbcolor 20 /LucidaSans-Typewriter83 f (TAME\(static void) 488 760 w (try_connect\(str h,) 688 980 w (int port\)\)) 888 1200 w ({) 488 1420 w (VARS { int fd; }) 688 1640 w (BLOCK{ tcpconnect\(h,) 688 1860 w (port, @\(fd\)\); }) 1288 2080 w (if\(fd < 0\)) 688 2960 w (warn << h << "\\n";) 888 3180 w (exit\(0\);) 688 3400 w (}) 488 3620 w (Tame TCP client.) 688 4060 w (static void cb1\(str, int\);) 2936 760 w (static void try_connect\(str h,) 2936 1200 w (int port\)) 3336 1420 w ({) 2936 1640 w (tcpconnect\(h, port,) 3256 1860 w (wrap\(cb1, h\)\);) 3656 2080 w (}) 2936 2300 w (static void cb1\(str h, int fd\)) 2936 2520 w ({) 2936 2740 w (if\(fd < 0\)) 3256 2960 w (warn << h << "\\n";) 3576 3180 w (exit\(0\);) 3256 3400 w (}) 2936 3620 w (Equivalent libasync) 3136 4060 w cleartomark showpage saveobj restore %%EndPage: 14 14 %%Page: 15 15 /saveobj save def mark 15 pagesetup gsave 1 1 .93 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -4800 rlineto -6400 0 rlineto closepath fill grestore gsave .93 .93 1 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -350 rlineto -6400 0 rlineto closepath fill grestore 22 /Times-Bold f (Example) 200 220 w (Extension:) 1087 220 w (Tame) 2146 220 w 0 0 0 setrgbcolor 20 /LucidaSans-Typewriter83 f (TAME\(static void) 488 760 w (try_connect\(str h,) 688 980 w (int port\)\)) 888 1200 w ({) 488 1420 w (VARS { int fd; }) 688 1640 w (BLOCK{ tcpconnect\(h,) 688 1860 w (port, @\(fd\)\); }) 1288 2080 w (if\(fd < 0\)) 688 2960 w (warn << h << "\\n";) 888 3180 w (exit\(0\);) 688 3400 w (}) 488 3620 w (Tame TCP client.) 688 4060 w (static void cb1\(str h, int fd\)) 2936 760 w ({) 2936 980 w (if\(fd < 0\)) 3256 1200 w (warn << h << "\\n";) 3576 1420 w (exit\(0\);) 3256 1640 w (}) 2936 1860 w (static void try_connect\(str h,) 2936 2080 w (int port\)) 3336 2300 w ({) 2936 2520 w (tcpconnect\(h, port,) 3256 2740 w (wrap\(cb1, h\)\);) 3656 2960 w (}) 2936 3180 w (Libasync in the wild.) 3136 4060 w cleartomark showpage saveobj restore %%EndPage: 15 15 %%Page: 16 16 /saveobj save def mark 16 pagesetup gsave 1 1 .93 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -4800 rlineto -6400 0 rlineto closepath fill grestore gsave .93 .93 1 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -350 rlineto -6400 0 rlineto closepath fill grestore 22 /Times-Bold f (Example) 200 220 w (Extension:) 1087 220 w (Tame) 2146 220 w 0 0 0 setrgbcolor 20 /LucidaSans-Typewriter83 f (VARS { int fd; }) 488 760 w (BLOCK{ tcpconnect\(h,) 488 980 w (port, @\(fd\)\); }) 888 1200 w (exit\(fd\);) 488 1420 w (static void cb1\(void\) {exit\(fd\);}) 2936 760 w (tcpconnect\(port, wrap\(cb1\)\);) 2936 980 w 20 /Times-Roman f (Benefits of Tame:) 488 2080 w 20 /LucidaSansUnicode20 f (\023) 538 2340 w 20 /Times-Roman f (more concise, more readable) 688 2340 w 20 /LucidaSansUnicode20 f (\023) 538 2600 w 20 /Times-Roman f (does not encourage upside\255down programming) 688 2600 w 20 /LucidaSansUnicode20 f (\023) 538 2860 w 20 /Times-Roman f (easy to handle multiple parallel threads\255of\255control) 688 2860 w 20 /LucidaSansUnicode20 f (\023) 538 3120 w 20 /Times-Roman f (can write structured programs again \() 688 3120 w 20 /LucidaSans-Typewriter83 f (if) 3674 3120 w 20 /Times-Roman f (,) 3874 3120 w 20 /LucidaSans-Typewriter83 f (for) 3974 3120 w 20 /Times-Roman f (, ...\)) 4274 3120 w cleartomark showpage saveobj restore %%EndPage: 16 16 %%Page: 17 17 /saveobj save def mark 17 pagesetup gsave 1 1 .93 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -4800 rlineto -6400 0 rlineto closepath fill grestore gsave .93 .93 1 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -350 rlineto -6400 0 rlineto closepath fill grestore 22 /Times-Bold f (Example) 200 220 w (Extension:) 1087 220 w (Plan 9 Kernel) 2146 220 w (Checker) 3498 220 w 0 0 0 setrgbcolor 24 /Times-Roman f (Plan 9 kernel has) 200 740 w (many conventions) 1905 740 w (to remember:) 3718 740 w (\(So does) 200 1000 w (any large) 1093 1000 w (program.\)) 2037 1000 w 24 /LucidaSansUnicode20 f (\023) 260 1520 w 24 /Times-Roman f (lock/unlock pairing) 440 1520 w 24 /LucidaSansUnicode20 f (\023) 260 1780 w 24 /Times-Roman f (no sleeping in interrupt handlers) 440 1780 w 24 /LucidaSansUnicode20 f (\023) 260 2040 w 24 /Times-Roman f (interrupt handlers) 440 2040 w (must use) 2197 2040 w (ilocks) 3105 2040 w 24 /LucidaSansUnicode20 f (\023) 260 2300 w 24 /Times-Roman f (exception stack for error handling) 440 2300 w 24 /LucidaSansUnicode20 f (\023) 260 2560 w 24 /Times-Roman f (kernel/user pointers) 440 2560 w 24 /LucidaSansUnicode20 f (\023) 260 2820 w 24 /Times-Roman f (no dereferencing user pointers) 440 2820 w (in interrupt handlers) 3406 2820 w 24 /LucidaSansUnicode20 f (\023) 260 3080 w 24 /Times-Roman f (...) 440 3080 w (Many are) 200 3600 w (checked at run\255time.) 1171 3600 w (No fundamental reason not to check at compile) 200 3860 w (time.) 4794 3860 w cleartomark showpage saveobj restore %%EndPage: 17 17 %%Page: 18 18 /saveobj save def mark 18 pagesetup gsave 1 1 .93 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -4800 rlineto -6400 0 rlineto closepath fill grestore gsave .93 .93 1 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -350 rlineto -6400 0 rlineto closepath fill grestore 22 /Times-Bold f (Example) 200 220 w (Extension:) 1087 220 w (Plan 9 Kernel) 2146 220 w (Checker) 3498 220 w 0 0 0 setrgbcolor 24 /Times-Roman f (Add attributes) 200 740 w (to document and enforce) 1626 740 w (conventions.) 4061 740 w 20 /LucidaSans-Typewriter83 f (void *ialloc\(int\) attribute\(nosleep\);) 488 1280 w (void *malloc\(int\) attribute\(nosleep\);) 488 1500 w (void print\(char*, ...\);) 488 1720 w (void*) 488 2160 w (ialloc\(int n\)) 488 2380 w ({) 488 2600 w (void *v;) 888 2820 w (v = malloc\(n\);) 888 3260 w (return v;) 888 3920 w (}) 488 4140 w cleartomark showpage saveobj restore %%EndPage: 18 18 %%Page: 19 19 /saveobj save def mark 19 pagesetup gsave 1 1 .93 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -4800 rlineto -6400 0 rlineto closepath fill grestore gsave .93 .93 1 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -350 rlineto -6400 0 rlineto closepath fill grestore 22 /Times-Bold f (Example) 200 220 w (Extension:) 1087 220 w (Plan 9 Kernel) 2146 220 w (Checker) 3498 220 w 0 0 0 setrgbcolor 24 /Times-Roman f (Add attributes) 200 740 w (to document and enforce) 1626 740 w (conventions.) 4061 740 w 20 /LucidaSans-Typewriter83 f (void *ialloc\(int\) attribute\(nosleep\);) 488 1020 w (void *malloc\(int\) attribute\(nosleep\);) 488 1240 w (void print\(char*, ...\);) 488 1460 w (void*) 488 1900 w (ialloc\(int n\)) 488 2120 w ({) 488 2340 w (void *v;) 888 2560 w (v = malloc\(n\);) 888 3000 w 0.75 0 0 setrgbcolor (if\(v == nil\)) 888 3220 w (print\("ialloc returning nil\\n"\);) 1288 3440 w 0 0 0 setrgbcolor (return v;) 888 3660 w (}) 488 3880 w 0 0 0 setrgbcolor 24 /Times-Roman f (Compiler can tell programmer he) 200 4460 w (made) 3455 4460 w (a) 4034 4460 w (mistake.) 4200 4460 w cleartomark showpage saveobj restore %%EndPage: 19 19 %%Page: 20 20 /saveobj save def mark 20 pagesetup gsave 1 1 .93 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -4800 rlineto -6400 0 rlineto closepath fill grestore gsave .93 .93 1 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -350 rlineto -6400 0 rlineto closepath fill grestore 22 /LucidaSans-Typewriter83 f (rscc) 200 220 w 22 /Times-Bold f (overview) 695 220 w 0 0 0 setrgbcolor 24 /Times-Roman f (Front end only) 200 740 w 24 /LucidaSansUnicode20 f (\023) 320 1000 w 24 /Times-Roman f (compile) 500 1000 w (to low\255level C) 1333 1000 w (and invoke) 2766 1000 w 24 /LucidaSans-Typewriter83 f (gcc) 3885 1000 w 24 /Times-Roman f (Written using itself) 200 1520 w (Extensible) 200 2040 w (LR\(1\) parser) 1273 2040 w (Extensible) 200 2560 w (grammar notation) 1273 2560 w (Destructuring syntax) 200 3080 w (Restructuring syntax) 200 3600 w (Other extensions) 200 4120 w (as) 1879 4120 w (convenient) 2139 4120 w cleartomark showpage saveobj restore %%EndPage: 20 20 %%Page: 21 21 /saveobj save def mark 21 pagesetup gsave 1 1 .93 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -4800 rlineto -6400 0 rlineto closepath fill grestore gsave .93 .93 1 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -350 rlineto -6400 0 rlineto closepath fill grestore 22 /Times-Bold f (Extensible) 200 220 w (LR\(1\)) 1235 220 w (parser) 1851 220 w 0 0 0 setrgbcolor 24 /Times-Roman f (Shift\255reduce) 200 740 w (parsers) 1443 740 w (run an NFA) 2181 740 w (on input.) 3386 740 w 24 /LucidaSansUnicode20 f (\023) 260 1000 w 24 /Times-Roman f (NFA) 440 1000 w (says) 980 1000 w (shift or reduce) 1454 1000 w (at each step) 2897 1000 w (Parse) 500 1260 w 24 /LucidaSans-Typewriter83 f (x * x + x) 1079 1260 w (x) 800 1520 w (* x + x) 2360 1520 w (shift) 3560 1520 w (x *) 800 1780 w (x + x) 2360 1780 w (shift) 3560 1780 w (x * x) 800 2040 w (+ x) 2360 2040 w (reduce x => x*x) 3560 2040 w (x) 800 2300 w (+ x) 2360 2300 w (shift) 3560 2300 w (x +) 800 2560 w (x) 2360 2560 w (shift) 3560 2560 w (x + x) 800 2820 w (reduce x => x+x) 3560 2820 w (x) 800 3080 w cleartomark showpage saveobj restore %%EndPage: 21 21 %%Page: 22 22 /saveobj save def mark 22 pagesetup gsave 1 1 .93 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -4800 rlineto -6400 0 rlineto closepath fill grestore gsave .93 .93 1 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -350 rlineto -6400 0 rlineto closepath fill grestore 22 /Times-Bold f (Extensible) 200 220 w (LR\(1\)) 1235 220 w (parser) 1851 220 w 0 0 0 setrgbcolor 24 /Times-Roman f (Shift\255reduce) 200 740 w (parsers) 1443 740 w (run an NFA) 2181 740 w (on input.) 3386 740 w 24 /LucidaSansUnicode20 f (\023) 260 1000 w 24 /Times-Roman f (NFA) 440 1000 w (says) 980 1000 w (shift or reduce) 1454 1000 w (at each step) 2897 1000 w 24 /LucidaSansUnicode20 f (\023) 260 1260 w 24 /Times-Roman f (NFA) 440 1260 w (corresponds) 980 1260 w (exactly to grammar rules) 2198 1260 w 24 /LucidaSans-Typewriter83 f (Yacc) 200 1780 w 24 /Times-Roman f (precomputes, hard\255codes) 740 1780 w (equivalent DFA.) 3195 1780 w (New) 200 2300 w (parser for rscc:) 712 2300 w 24 /LucidaSansUnicode20 f (\023) 260 2820 w 24 /Times-Roman f (run determinization on the) 440 2820 w (fly, caching result.) 3037 2820 w 24 /LucidaSansUnicode20 f (\023) 260 3080 w 24 /Times-Roman f (if grammar changes, throw) 440 3080 w (away DFA) 3081 3080 w (built so far.) 4186 3080 w 24 /LucidaSansUnicode20 f (\023) 260 3600 w 24 /Times-Roman f (normal C) 440 3600 w (library interface) 1400 3600 w 20 /LucidaSans-Typewriter83 f (yynewsym\(g, "\\"**\\"", 0\);) 488 3880 w (yylexnewsym\(g, "\\"**\\""\);) 488 4100 w (yyrulestr\(g, yyaction, "expr", "expr", "\\"**\\"", "expr", 0\);) 488 4320 w cleartomark showpage saveobj restore %%EndPage: 22 22 %%Page: 23 23 /saveobj save def mark 23 pagesetup gsave 1 1 .93 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -4800 rlineto -6400 0 rlineto closepath fill grestore gsave .93 .93 1 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -350 rlineto -6400 0 rlineto closepath fill grestore 22 /Times-Bold f (Grammar) 200 220 w (Syntax) 1207 220 w 0 0 0 setrgbcolor 24 /Times-Roman f (Use) 200 740 w (an extension to present a) 633 740 w (better parser interface.) 3064 740 w 20 /LucidaSans-Typewriter83 f (yacc {) 488 1020 w (yaccsym right "**" %prec "*";) 888 1240 w (expr: expr "**" expr;) 888 1680 w (}) 488 1900 w 0 0 0 setrgbcolor 24 /Times-Roman f (Compiles) 200 2480 w (into appropriate) 1182 2480 w (function calls.) 2766 2480 w (Provides) 200 3000 w (default) 1100 3000 w 24 /LucidaSans-Typewriter83 f (yyaction) 1825 3000 w 24 /Times-Roman f (rule) 2845 3000 w (that builds) 3277 3000 w (an abstract syntax) 4345 3000 w (tree) 200 3260 w (node.) 618 3260 w cleartomark showpage saveobj restore %%EndPage: 23 23 %%Page: 24 24 /saveobj save def mark 24 pagesetup gsave 1 1 .93 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -4800 rlineto -6400 0 rlineto closepath fill grestore gsave .93 .93 1 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -350 rlineto -6400 0 rlineto closepath fill grestore 22 /Times-Bold f (Destructuring Syntax) 200 220 w 0 0 0 setrgbcolor 24 /Times-Roman f (Need to make) 200 740 w (abstract syntax tree) 1591 740 w (nodes) 3501 740 w (accessible.) 4121 740 w (Don't want extension writer to need to know) 200 1260 w (internal representation.) 4555 1260 w (Provide) 200 1780 w (matching operator) 1006 1780 w 24 /LucidaSans-Typewriter83 f (~) 2816 1780 w 24 /Times-Roman f (for destructuring syntax.) 2996 1780 w 20 /LucidaSans-Typewriter83 f (Node *a, *b, n;) 488 2320 w (if\(n ~ `expr{ \\a**\\b }\)) 488 2760 w (warn\("using **: base=%N exponent=%N", a, b\);) 888 2980 w cleartomark showpage saveobj restore %%EndPage: 24 24 %%Page: 25 25 /saveobj save def mark 25 pagesetup gsave 1 1 .93 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -4800 rlineto -6400 0 rlineto closepath fill grestore gsave .93 .93 1 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -350 rlineto -6400 0 rlineto closepath fill grestore 22 /Times-Bold f (Restructuring Syntax) 200 220 w 0 0 0 setrgbcolor 24 /Times-Roman f (Same) 200 740 w (syntax as) 793 740 w (destructuring, but used as) 1740 740 w (expression) 4252 740 w (instead of next to) 200 1000 w 24 /LucidaSans-Typewriter83 f (~) 1919 1000 w 24 /Times-Roman f (.) 2039 1000 w 20 /LucidaSans-Typewriter83 f (Node *n, *a, *b;) 488 1540 w (if\(n ~ `expr{ \\a**\\b }\)) 488 1980 w (n = `expr{ pow\(\\a, \\b\) };) 888 2200 w 0 0 0 setrgbcolor 24 /Times-Roman f (The) 200 2780 w 24 /LucidaSans-Typewriter83 f (a) 632 2780 w 24 /Times-Roman f (and) 812 2780 w 24 /LucidaSans-Typewriter83 f (b) 1218 2780 w 24 /Times-Roman f (are) 1398 2780 w (substituted as) 1749 2780 w (units, not as) 3111 2780 w (token streams.) 4326 2780 w 20 /LucidaSans-Typewriter83 f (int x;) 488 3320 w (Node *n, *nn;) 488 3540 w (x = 2;) 488 3980 w (n = `expr{ 1+\\x };) 488 4200 w (nn = `expr{ \\n*3 };) 488 4420 w cleartomark showpage saveobj restore %%EndPage: 25 25 %%Page: 26 26 /saveobj save def mark 26 pagesetup gsave 1 1 .93 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -4800 rlineto -6400 0 rlineto closepath fill grestore gsave .93 .93 1 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -350 rlineto -6400 0 rlineto closepath fill grestore 22 /Times-Bold f (Extensible) 200 220 w (Functions) 1235 220 w 0 0 0 setrgbcolor 24 /Times-Roman f (Linked list of function pointers) 200 740 w (implementing a) 3245 740 w (function.) 4805 740 w (Each function can handle) 200 1260 w (a) 2688 1260 w (call itself, with or without) 2854 1260 w (invoking next function in the) 200 1520 w (list.) 3046 1520 w (Syntax codifies) 200 2040 w (the) 1746 2040 w (idiom.) 2099 2040 w 20 /LucidaSans-Typewriter83 f (extend) 488 2320 w (Node*) 488 2540 w (compile\(Node *n\)) 488 2760 w ({) 488 2980 w (Node *a, *b;) 888 3200 w (if\(n ~ `expr{ \\a**\\b }\)) 888 3640 w (return compile\(`expr{ pow\(\\a, \\b\) }\);) 1288 3860 w (return default;) 888 4080 w (}) 488 4300 w cleartomark showpage saveobj restore %%EndPage: 26 26 %%Page: 27 27 /saveobj save def mark 27 pagesetup gsave 1 1 .93 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -4800 rlineto -6400 0 rlineto closepath fill grestore gsave .93 .93 1 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -350 rlineto -6400 0 rlineto closepath fill grestore 22 /Times-Bold f (Extensible) 200 220 w (data structures) 1235 220 w 0 0 0 setrgbcolor 24 /Times-Roman f (Same) 200 740 w (idea) 793 740 w (as) 1252 740 w (functions; not sure) 1512 740 w (of implementation.) 3358 740 w 20 /LucidaSans-Typewriter83 f (extend) 488 1280 w (struct Node) 488 1500 w ({) 488 1720 w (int extra;) 888 1940 w (int other;) 888 2160 w (int field;) 888 2380 w (};) 488 2600 w cleartomark showpage saveobj restore %%EndPage: 27 27 %%Page: 28 28 /saveobj save def mark 28 pagesetup gsave 1 1 .93 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -4800 rlineto -6400 0 rlineto closepath fill grestore gsave .93 .93 1 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -350 rlineto -6400 0 rlineto closepath fill grestore 22 /Times-Bold f (Other) 200 220 w (extensions:) 817 220 w (iterators) 1912 220 w 0 0 0 setrgbcolor 20 /LucidaSans-Typewriter83 f (static int start\(State *z, Rule *r\);) 488 760 w (static int next\(State *z, Sym **s\);) 488 980 w (static int end\(State*\);) 488 1200 w (iterator\(start, next, end\);) 488 1420 w (Rule *r;) 488 1860 w (Sym *s;) 488 2080 w (for\(s in r\)) 488 2520 w (something\(s\);) 888 2740 w cleartomark showpage saveobj restore %%EndPage: 28 28 %%Page: 29 29 /saveobj save def mark 29 pagesetup gsave 1 1 .93 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -4800 rlineto -6400 0 rlineto closepath fill grestore gsave .93 .93 1 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -350 rlineto -6400 0 rlineto closepath fill grestore 22 /Times-Bold f (Related Work) 200 220 w 0 0 0 setrgbcolor 24 /Times-Roman f (Lots) 200 740 w (of macro systems) 687 740 w 24 /LucidaSansUnicode20 f (\023) 260 1000 w 24 /Times-Roman f (can't write) 440 1000 w (checkers) 1530 1000 w (with those.) 2427 1000 w 24 /LucidaSansUnicode20 f (\023) 260 1260 w 24 /Times-Roman f (often run into scoping problems) 440 1260 w (Other extensible) 200 1780 w (languages/compilers) 1838 1780 w 24 /LucidaSansUnicode20 f (\023) 260 2040 w 24 /Times-Roman f (require) 440 2040 w (programmers) 1177 2040 w (to know) 2514 2040 w (too much about internals) 3354 2040 w 24 /LucidaSansUnicode20 f (\023) 260 2300 w 24 /Times-Roman f (not easy enough to write) 440 2300 w (extensions) 2858 2300 w cleartomark showpage saveobj restore %%EndPage: 29 29 %%Page: 30 30 /saveobj save def mark 30 pagesetup gsave 1 1 .93 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -4800 rlineto -6400 0 rlineto closepath fill grestore gsave .93 .93 1 setrgbcolor 0 0 moveto 6400 0 rlineto 0 -350 rlineto -6400 0 rlineto closepath fill grestore 22 /Times-Bold f (Status) 200 220 w 0 0 0 setrgbcolor 24 /LucidaSans-Typewriter83 f (Rscc) 200 740 w 24 /Times-Roman f (exists.) 740 740 w 24 /LucidaSansUnicode20 f (\023) 260 1000 w 24 /Times-Roman f (uses) 440 1000 w (extensible) 914 1000 w (grammar, yacc) 1947 1000 w (syntax) 3429 1000 w 24 /LucidaSansUnicode20 f (\023) 260 1260 w 24 /Times-Roman f (provides) 440 1260 w (its) 1326 1260 w (own grammar action functions) 1614 1260 w 24 /LucidaSansUnicode20 f (\023) 260 1520 w 24 /Times-Roman f (uses) 440 1520 w (restructuring, not destructuring) 914 1520 w 24 /LucidaSansUnicode20 f (\023) 260 1780 w 24 /Times-Roman f (uses) 440 1780 w (extensible) 914 1780 w (functions) 1947 1780 w (heavily) 2900 1780 w 24 /LucidaSansUnicode20 f (\023) 260 2040 w 24 /Times-Roman f (no extensible) 440 2040 w (data) 1773 2040 w (structures) 2232 2040 w (yet) 3224 2040 w 24 /LucidaSansUnicode20 f (\023) 260 2300 w 24 /Times-Roman f (uses) 440 2300 w (iterators) 914 2300 w (heavily) 1759 2300 w 24 /LucidaSansUnicode20 f (\023) 260 2820 w 24 /Times-Roman f (know) 440 2820 w (how) 1033 2820 w (to switch over to implicit) 1506 2820 w (actions) 440 3080 w (and destructuring) 1180 3080 w 24 /LucidaSansUnicode20 f (\023) 260 3340 w 24 /Times-Roman f (need to find ways) 440 3340 w (to hide) 2198 3340 w (other aspects) 2918 3340 w (of compiler internals) 440 3600 w (\(types, flow) 2497 3600 w (control, ...\)) 3702 3600 w 24 /LucidaSansUnicode20 f (\023) 260 4120 w 24 /Times-Roman f (submit to OSDI) 440 4120 w 24 /LucidaSansUnicode20 f (\023) 260 4640 w 24 /Times-Roman f (always) 440 4640 w (looking for more) 1166 4640 w (target uses) 2850 4640 w cleartomark showpage saveobj restore %%EndPage: 30 30 %%Trailer done %%DocumentFonts: Times-Roman LucidaSansUnicode20 Times-Italic Times-Bold LucidaSans-Typewriter83 %%Pages: 30