From 548d7596f4f02f05117cf5f7c6a625bbb9f8af0a Mon Sep 17 00:00:00 2001 From: Kyle Isom Date: Thu, 3 Apr 2025 16:38:19 -0700 Subject: [PATCH] fix typo and add benchmark code --- lisp/tak.lsp | 86 +++++++++++++++++++++++++++++++++++++++++++++++++++ ulisp-arm.ino | 2 +- 2 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 lisp/tak.lsp diff --git a/lisp/tak.lsp b/lisp/tak.lsp new file mode 100644 index 0000000..c92f42d --- /dev/null +++ b/lisp/tak.lsp @@ -0,0 +1,86 @@ +(defun tak (x y z) + (if (not (< y x)) + z + (tak + (tak (1- x) y z) + (tak (1- y) z x) + (tak (1- z) x y)))) + +(defun benchmark-tak () + (tak 18 12 6)) + +(defun fib (n) + (if (< n 3) 1 + (+ (fib (- n 1)) (fib (- n 2))))) + +(defun benchmark-fib () + (fib 23)) + +(defun q (n) + (if (<= n 2) 1 + (+ + (q (- n (q (- n 1)))) + (q (- n (q (- n 2))))))) + +(defun benchmark-q () + (q 21)) + +(defun q2 (x y) + (if (or (< x 1) (< y 1)) 1 + (+ (q2 (- x (q2 (1- x) y)) y) + (q2 x (- y (q2 x (1- y))))))) + +(defun benchmark-q2 () + (q2 7 8)) + +(defun factor (n) + (cond + ((zerop (mod n 2)) 2) + ((zerop (mod n 3)) 3) + (t (let ((d 5) (i 2)) + (loop + (when (> (* d d) n) (return n)) + (when (zerop (mod n d)) (return d)) + (incf d i) (setq i (- 6 i))))))) + +(defvar *factor-prime* 2142142141) +(defun benchmark-factor () + (factor *factor-prime*)) + +(defun sieve (size) + (let ((a (make-array size :element-type 'bit)) + max) + (setf (aref a 0) 1 (aref a 1) 1) + (dotimes (i size max) + (when (zerop (aref a i)) + (setq max i) + (do ((j (* 2 i) (+ j i))) ((>= j size)) (setf (aref a j) 1)))))) + +(defun benchmark-sieve () + (sieve 100000)) + +(defun benchmark-check (fun expected) + (let ((answer (fun))) + (unless (eq answer expected) + (error "benchmark failed: have ~a, expected ~a~%" + answer + expected) + t))) + +(defun benchmark-time-it (fun expected) + (time (benchmark-check fun expected))) + +(defun benchmark () + (print '(tak 18 12 6)) + (benchmark-time-it benchmark-tak 7) + (print '(fib 23)) + (benchmark-time-it benchmark-fib 28657) + (print '(q 21)) + (benchmark-time-it benchmark-q 12) + (print '(q2 7 8)) + (benchmark-time-it benchmark-q2 31) + (print '(factor 2142142141)) + (benchmark-time-it benchmark-factor *factor-prime*) + (print '(sieve 100000)) + (benchmark-time-it benchmark-sieve 99991)) + diff --git a/ulisp-arm.ino b/ulisp-arm.ino index 563142e..4b4b4e2 100644 --- a/ulisp-arm.ino +++ b/ulisp-arm.ino @@ -2287,7 +2287,7 @@ checkkeyword(object *obj) builtin_t kname = builtin(obj->name); uint8_t context = getminmax(kname); - if (context != 0 && context !e Context) { + if (context != 0 && context != Context) { error(invalidkey, obj); }