diff --git a/partial_eval.csc b/partial_eval.csc new file mode 100644 index 0000000..862605e --- /dev/null +++ b/partial_eval.csc @@ -0,0 +1,65 @@ +(import (chicken process-context)) +(import (chicken port)) +(import (r5rs)) +(define-syntax rec-lambda + (er-macro-transformer + (lambda (x r c) + (let ( + (name (car (cdr x))) + (params (car (cdr (cdr x)))) + (body (car (cdr (cdr (cdr x))))) + ) + `(rec ,name (lambda ,params ,body)))))) +(let* ( + (array list) + (concat append) + (len length) + (idx list-ref) + + (= equal?) + (drop (rec-lambda recurse (x i) (if (= 0 i) x (recurse (cdr x) (- i 1))))) + (take (rec-lambda recurse (x i) (if (= 0 i) '() (cons (car x) (recurse (cdr x) (- i 1)))))) + (slice (lambda (x s e) (let* ( (l (len x)) + (s (if (< s 0) (+ s l 1) s)) + (e (if (< e 0) (+ e l 1) e)) + (t (- e s)) ) + (take (drop x s) t)))) + ) + +(let* ( + + (val? (lambda (x) (= 'val (idx x 0)))) + (.val (lambda (x) (idx x 1))) + (marked_array? (lambda (x) (= 'marked_array (idx x 0)))) + (.marked_array_is_val (lambda (x) (idx x 1))) + (.marked_array_values (lambda (x) (idx x 2))) + (marked_symbol? (lambda (x) (= 'marked_symbol (idx x 0)))) + (.marked_symbol_is_val (lambda (x) (idx x 1))) + (.marked_symbol_value (lambda (x) (idx x 2))) + (comb? (lambda (x) (= 'comb (idx x 0)))) + (.comb (lambda (x) (slice x 1 -1))) + (prim_comb? (lambda (x) (= 'prim_comb (idx x 0)))) + (.prim_comb (lambda (x) (idx x 1))) + (marked_env? (lambda (x) (= 'env (idx x 0)))) + (marked_env_real? (lambda (x) (idx x 1))) + (.marked_env_idx (lambda (x) (idx x 2))) + (.env_marked (lambda (x) (idx x 3))) + + (test-all (lambda () (begin + (print (val? '(val))) + (print "take 3" (take '(1 2 3 4 5 6 7 8 9 10) 3)) + (print "drop 3" (drop '(1 2 3 4 5 6 7 8 9 10) 3)) + (print (slice '(1 2 3) 1 2)) + (print (slice '(1 2 3) 1 -1)) + (print (slice '(1 2 3) -1 -1)) + (print (slice '(1 2 3) -2 -1)) + + (print (array 1 2 3)) + (print (command-line-arguments)) + + (print (call-with-input-string "'(1 2)" (lambda (p) (read p)))) + (print (read (open-input-string "'(3 4)"))) + ))) + +) (test-all)) +) diff --git a/shell.nix b/shell.nix index 9be631e..4c01652 100644 --- a/shell.nix +++ b/shell.nix @@ -8,5 +8,7 @@ mkShell { nodejs valgrind kcachegrind + chicken + chez ]; }