diff --git a/opt-test.scm b/opt-test.scm index f34a32ea..ee3dbb4b 100644 --- a/opt-test.scm +++ b/opt-test.scm @@ -7,7 +7,7 @@ (import (scheme base) (scheme write) (scheme read)) -(let ((x (read)) +#;(let ((x (read)) (y (read)) (z (read)) (iterations 10000000) @@ -17,3 +17,28 @@ (set! sum (+ sum sum (* x y z))) (set! sum (- sum sum (* x y z)))) (write sum)) + +;; Take an expression containing a single function call and break it up +;; into many calls of 2 arguments each. +(define (->dyadic expr) + (cond + ((< (length expr) 4) + expr) + (else + (let ((fnc (car expr))) + (foldl + (lambda (x acc) + (list fnc acc x)) + `(,fnc ,(cadr expr) ,(caddr expr)) + (cdddr expr)))))) + +(write (->dyadic '(+ 1))) +(write (->dyadic '(+ 1 2))) +(write (->dyadic '(+ 1 2 3))) +(write (->dyadic '(+ 1 2 3 4))) +;(write +; (foldl +; (lambda (x acc) +; (list 'Cyc-fast-plus acc x)) +; '(Cyc-fast-plus 1 2) +; '(3 4 5)))