summaryrefslogtreecommitdiff
path: root/ipl/progs/empg.icn
diff options
context:
space:
mode:
Diffstat (limited to 'ipl/progs/empg.icn')
-rw-r--r--ipl/progs/empg.icn119
1 files changed, 119 insertions, 0 deletions
diff --git a/ipl/progs/empg.icn b/ipl/progs/empg.icn
new file mode 100644
index 0000000..5920c2f
--- /dev/null
+++ b/ipl/progs/empg.icn
@@ -0,0 +1,119 @@
+############################################################################
+#
+# File: empg.icn
+#
+# Subject: Program to make expression-evaluation programs
+#
+# Author: Ralph E. Griswold
+#
+# Date: December 16, 1998
+#
+############################################################################
+#
+# This file is in the public domain.
+#
+############################################################################
+#
+# This program produces a program for evaluating Icon expressions. The
+# input to this program has three forms, depending on the first character
+# of each line:
+#
+# : the remainder of the line is an expression to be evaluated
+# only once
+#
+# % the remainder of the line is part of a declaration
+#
+# # the remainder of the line is a comment and is ignored
+#
+# Anything else is an expression to be evaluated in a loop.
+#
+# For example, the input
+#
+# # Time record access
+# %record complex(r, i)
+# :z := complex(1.0, 3.5)
+# z.r
+#
+# produces a program to time z.r in a loop.
+
+# The following options are supported:
+#
+# -l i use i for the number of loop iterations, default 100000
+# -d i use i for the "delta" to adjust timings; otherwise it
+# is computed when the expression-evaluation program
+# is run
+#
+############################################################################
+#
+# Links: options
+#
+############################################################################
+
+link options
+
+global decls
+
+procedure main(args)
+ local line, opts, limit, delcomp
+
+ opts := options(args, "d+l+")
+
+ write("link empgsup")
+ write("link options")
+ write("procedure main(args)")
+ write(" local opts")
+ write(" opts := options(args, \"d+l+\")")
+ write(" _Limit := ", \opts["l"] | " \\opts[\"l\"] | 100000")
+ write(" _Delta := ", \opts["d"] | " \\opts[\"d\"] | _Initialize(_Limit)")
+
+ decls := []
+
+ while line := read() do
+ line ? {
+ if =":" then evaluate(tab(0))
+ else if ="%" then declare(tab(0))
+ else if ="#" then next
+ else timeloop(tab(0))
+ }
+
+ write("end")
+
+ every write(!decls)
+
+end
+
+# Save a declaration line.
+
+procedure declare(line)
+
+ put(decls, line)
+
+ return
+
+end
+
+# Produce code to just evaluate an expression.
+
+procedure evaluate(expr)
+
+ write(" ", expr)
+
+ return
+
+end
+
+# Produce code to evaluate an expression in a loop and time it.
+
+procedure timeloop(expr)
+
+ write(" write(", image(expr), ")")
+ write(" _Itime := &time")
+ write(" every 1 to _Limit do {")
+ write(" &null & (", expr, ")")
+ write(" }")
+ write(" write(real(&time - _Itime -_Delta) / _Limit, \" ms.\")")
+ write(" write()")
+
+ return
+
+end