- These "pipes" can be any type (including tagged unions), in essence you have "strong typed" pipes (compile time checked) ... Perfect for a message passing system.
- The shell "&" can also be implemented. Happily the "&" is trivial when implemented with Algol68's parallel clause...
MODE PAGEIN = PAGE, PAGEAPPEND = REF PAGE, PAGEOUT = REF PAGE; MODE MOID = VOID, YIELDLINE = PROC(LINE)VOID, GENLINE = PROC(YIELDLINE)VOID, FILTER = PROC(GENLINE)GENLINE, # the classic shell filter # MANYTOONE = PROC(GENLINE)GENLINE; # eg cat, as in con[cat]enate # PRIO =: = 5, << = 5, >> = 5; OP < = (FILTER filter, PAGEIN page)GENLINE: filter(READ page), < = (MANYTOONE cmd, PAGEIN page)GENLINE: cmd(READ page), << = (FILTER filter, PAGEIN page)GENLINE: filter(READ page), > = (GENLINE gen, PAGEOUT page)VOID: gen(WRITE page), >> = (GENLINE gen, PAGEAPPEND page)VOID: gen(APPEND page), =: = (GENLINE gen, FILTER filter)GENLINE: filter(gen), =: = (GENLINE gen, MANYTOONE cmd)GENLINE: cmd(gen);
# Sample ''utilities'' PROCedure declarations # PROC cat = (GENLINE argv)GENLINE:~; PROC tee = (YIELDLINE args filter)FILTER:~; PROC grep = (STRING pattern, GENLINE argv)GENLINE:~; PROC uniq = (GENLINE arg)GENLINE:~; PROC sort = (GENLINE arg)GENLINE:~; PROC head = (INT n, GENLINE args)GENLINE:~; PROC tail = (INT n, GENLINE args)GENLINE:~;
# Sample ''pipe I/O'' OPerator declarations # OP READ = (PAGEIN page)GENLINE:~; OP WRITE = (PAGEOUT page)YIELDLINE: ~; OP APPEND = (PAGEAPPEND page)YIELDLINE:~;
#!/usr/local/bin/a68g --script # # First define what kind of record (aka LINE) we are piping and filtering # FORMAT line fmt = $xg$; MODE LINE = STRING, PAGE = FLEXLINE, BOOK = FLEXPAGE; PR READ "Iterator_pipe_page.a68" PR PR READ "Iterator_pipe_operators.a68" PR PR READ "Iterator_pipe_utilities.a68" PR PAGE list of computer scientists = ( "Wil van der Aalst - business process management, process mining, Petri nets", "Hal Abelson - intersection of computing and teaching", "Serge Abiteboul - database theory", "Samson Abramsky - game semantics", "Leonard Adleman - RSA, DNA computing", "Manindra Agrawal - polynomial-time primality testing", "Luis von Ahn - human-based computation", "Alfred Aho - compilers book, the 'a' in AWK", "Stephen R. Bourne - Bourne shell, portable ALGOL 68C compiler", "Kees Koster - ALGOL 68", "Lambert Meertens - ALGOL 68, ABC (programming language)", "Peter Naur - BNF, ALGOL 60", "Guido van Rossum - Python (programming language)", "Adriaan van Wijngaarden - Dutch pioneer; ARRA, ALGOL", "Dennis E. Wisnosky - Integrated Computer-Aided Manufacturing (ICAM), IDEF", "Stephen Wolfram - Mathematica", "William Wulf - compilers", "Edward Yourdon - Structured Systems Analysis and Design Method", "Lotfi Zadeh - fuzzy logic", "Arif Zaman - Pseudo-random number generator", "Albert Zomaya - Australian pioneer of scheduling in parallel and distributed systems", "Konrad Zuse - German pioneer of hardware and software" ); PAGE algol pioneers list, the scientists list; PAGE aa; # Now do a bit of plumbing: # cat(( head(4, ) < list of computer scientists, cat(READ list of computer scientists) =: grep("ALGOL", ) =: tee(WRITE algol pioneers list), tail(4, READ list of computer scientists) )) =: sort =: uniq =: tee(WRITE the scientists list) =: grep("aa", ) >> aa; # Finally check the result: # printf(( $"Pioneer: "$, line fmt, aa, $l$, $"Number of Algol pioneers: "g(-0)$, UPB algol pioneers list, $l$, $"Number of scientists: "g(-0)$, UPB the scientists list, $l$ ))
Pioneer: Adriaan van Wijngaarden - Dutch pioneer; ARRA, ALGOL Number of Algol pioneers: 6 Number of scientists: 15