fix typo and add benchmark code

This commit is contained in:
Kyle Isom 2025-04-03 16:38:19 -07:00
parent 96290cf128
commit 548d7596f4
2 changed files with 87 additions and 1 deletions

86
lisp/tak.lsp Normal file
View File

@ -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))

View File

@ -2287,7 +2287,7 @@ checkkeyword(object *obj)
builtin_t kname = builtin(obj->name); builtin_t kname = builtin(obj->name);
uint8_t context = getminmax(kname); uint8_t context = getminmax(kname);
if (context != 0 && context !e Context) { if (context != 0 && context != Context) {
error(invalidkey, obj); error(invalidkey, obj);
} }