variations on a theme
This is the grokout experiment, which is one of several variations on a theme:
translate to lispy-schemey prefix notation: | groklm_experiment |
translate to 3-address notation: | grokreg_experiment |
a filtering translator to lispy-schemey prefix notation: | grokout_experiment |
build and run the grokout ruleset
Here is the grokout.lmn ruleset as a web page: grokout
Compile the grokout ruleset as a shebang script called grokout.lm:
[user@machine web]$ make grokout.lm lmn2m -o grokout.lm -s /usr/bin/lm grokout.lmn chmod +x grokout.lm
Here is some text that contains a good deal of material that is recognised and some that is not - it's the code for Eratosthenes' sieve in Javascript:
[user@machine web]$ cat /home/user/src/dmdscript/1.0.6/dmdscript/sieve.ds
/* Eratosthenes Sieve prime number calculation. */
size = 8190; sizepl = 8191;
var flags = new Array(sizepl);
var i, prime, k, count, iter;
print("10 iterations\n"); starttime = new Date(); for (iter = 1; iter <= 10; iter++) { count = 0; for (i = 0; i <= size; i++) flags[i] = true; for (i = 0; i <= size; i++) { if (flags[i]) { prime = i + i + 3; k = i + prime; while (k <= size) { flags[k] = false; k += prime; } count += 1; } } } elapsedtime = new Date() - starttime; print("\n" + count + " primes\n"); print("elapsed time = " + elapsedtime + "\n");
Here is the result of applying the filtering translator ruleset - anything that it recognises as matching expr ";" is translated, everything else is copied (it is not suggested that the resulting output is of any use to anyone, and it is certainly no longer valid as Javascript):
[user@machine web]$ ./grokout.lm /home/user/src/dmdscript/1.0.6/dmdscript/sieve.ds
/* Eratosthenes Sieve prime number calculation. */
(CODE (set size 8190)) (CODE (set sizepl 8191))
var flags = new Array(CODE sizepl)
var i, prime, k, count, (CODE iter)
print("10 iterations\n"); starttime = new Date(); for ((CODE (set iter 1)) iter <= (CODE 10) iter++) { (CODE (set count 0)) for ((CODE (set i 0)) i <= (CODE size) i++) (CODE (set flags[i] true)) for ((CODE (set i 0)) i <= (CODE size) i++) { if (flags[i]) { (CODE (set prime (add (add i i) 3))) (CODE (set k (add i prime))) while (k <= size) { (CODE (set flags[k] false)) k += (CODE prime) } count += (CODE 1) } } } elapsedtime = new Date() (CODE (neg starttime)) print("\n" + count + " primes\n"); print("elapsed time = " + elapsedtime + "\n");