User defined pipe and redirection operators: Difference between revisions

Content added Content deleted
m (→‎{{header|ALGOL 68}}: remove #! from library.)
(→‎{{header|ALGOL 68}}: moved very long code to subpage)
Line 36: Line 36:


=={{header|ALGOL 68}}==
=={{header|ALGOL 68}}==
See [[User defined pipe and redirection operators/ALGOL 68]]
{{works with|ALGOL 68|Revision 1; one minor extension - PRAGMA READ; one major extension - Algol68G's [[wp:Currying|Currying]].}}{{works with|ALGOL 68G|tested with release [http://sourceforge.net/projects/algol68/files/algol68g/algol68g-1.18.0/algol68g-1.18.0-9h.tiny.el5.centos.fc11.i386.rpm/download 1.18.0-9h.tiny].}}
{{wont work with|ELLA ALGOL 68|Any (with appropriate job cards) - tested with release [http://sourceforge.net/projects/algol68/files/algol68toc/algol68toc-1.8.8d/algol68toc-1.8-8d.fc9.i386.rpm/download 1.8-8d] - due to extensive use of '''format'''[ted] ''transput''.}}
'''File: Iterator_pipe_operators.a68'''
<lang algol68>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);</lang>'''File: Iterator_pipe_utilities.a68'''
<lang algol68>PROC cat yield line = ([]GENLINE argv, YIELDLINE yield)VOID:
FOR gen line FROM LWB argv TO UPB argv DO
argv[gen line](yield)
OD;

PROC cat = ([]GENLINE argv)GENLINE:
cat yield line(argv, );

PROC tee yield line = (GENLINE gen, []YIELDLINE args yield, YIELDLINE yield)VOID: (
# FOR LINE line IN # gen(#) DO #
## (LINE line)VOID: (
yield(line);
FOR outn FROM LWB args yield TO UPB args yield DO
args yield[outn](line)
OD
# OD #))
);

PROC tee filter = (GENLINE gen, []YIELDLINE args yield)GENLINE:
tee yield line(gen, args yield, );

PROC tee = ([]YIELDLINE args filter)FILTER:
tee filter(, args filter);

PROC grep yield line = (STRING pattern, []GENLINE argv, YIELDLINE yield)VOID:
# FOR LINE line IN # cat(argv)(
## (LINE line)VOID:
IF string in string(pattern, NIL, line) THEN yield(line) FI
# OD #);

PROC grep = (STRING pattern, []GENLINE argv)GENLINE:
grep yield line(pattern, cat(argv), );

PROC uniq yield line = (GENLINE arg, YIELDLINE yield)VOID:(
UNION(VOID, LINE)prev := EMPTY;
# FOR LINE this IN # arg(#) DO #
## (LINE this)VOID:
CASE prev IN
(LINE case prev): IF NOT(case prev=this) THEN prev := this; yield(this) FI,
(VOID): (prev := this; yield(this))
ESAC
# OD #)
);

PROC uniq = (GENLINE arg)GENLINE:
uniq yield line(arg, );

MODE SORTSTRUCT = LINE;
PR READ "prelude/sort.a68" PR

PROC sort yield line = ([]GENLINE args, YIELDLINE yield)VOID:(
PAGE out; cat(args) > out; in place shell sort(out);
FOR elem FROM LWB out TO UPB out DO
yield(out[elem])
OD
);

PROC sort = (GENLINE arg)GENLINE:
sort yield line(arg, );

PROC head yield line= (INT n, []GENLINE args, YIELDLINE yield)VOID:
FOR argn FROM LWB args TO UPB args DO
GENLINE line gen = args[argn];
INT count := 0;
# FOR LINE line IN # cat(line gen)(#) DO #
## (LINE line)VOID:(
count+:=1;
yield(line);
IF count = n THEN done FI
# OD #));
done: SKIP
OD;

PROC head = (INT n, []GENLINE args)GENLINE:
head yield line(n, args, );

PROC tail yield line = (INT n, []GENLINE args, YIELDLINE yield)VOID:
FOR argn FROM LWB args TO UPB args DO
GENLINE gen line = args[argn];
[0:n-1]LINE window; INT window end := -1;
# FOR LINE line IN # gen line(#) DO #
## (LINE line)VOID:
window[(window end+:=1) MOD n]:= line
# OD #);
FOR line FROM window end-n+1 TO window end DO
IF line>=0 THEN
yield(window[line MOD n])
FI
OD
OD;

PROC tail = (INT n, []GENLINE args)GENLINE:
tail yield line(n, args, );

# Define an optional monadic OPerator #
OP TAIL = (INT n)MANYTOONE: tail(n, );</lang>'''File: Iterator_pipe_page.a68'''
<lang algol68># Define the required OPerators for pipes of user-defined type "PAGE" #
OP +:= = (PAGEOUT page, LINE line)MOID:(
[LWB page:UPB page+1]LINE out;
out[:UPB page]:=page;
out[UPB out]:=line;
page := out
);

PROC page read line = (PAGEIN page, YIELDLINE yield)VOID:
FOR elem FROM LWB page TO UPB page DO
yield(page[elem])
OD;

OP READ = (PAGEIN page)GENLINE:
page read line(page, );

PROC page append line = (PAGEAPPEND page, LINE line)VOID:
page +:= line;

OP WRITE = (PAGEOUT page)YIELDLINE: (
page := LINE();
page append line(page, )
);

OP APPEND = (PAGEAPPEND page)YIELDLINE:
page append line(page, );</lang>'''File: test_Iterator_pipe_page.a68'''
<lang algol68>#!/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 = FLEX[0]LINE,
BOOK = FLEX[0]PAGE;

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$
))</lang>
'''Output:'''
<pre>
Pioneer: Adriaan van Wijngaarden - Dutch pioneer; ARRA, ALGOL
Number of Algol pioneers: 6
Number of scientists: 15
</pre>


=={{header|J}}==
=={{header|J}}==