slovo/benchmarks/parse-loop/common-lisp/parse_loop.lisp
2026-05-22 08:38:43 +02:00

39 lines
1.3 KiB
Common Lisp

(declaim (optimize (speed 3) (safety 0) (debug 0)))
(defconstant +loop-count+ 1000000)
(defconstant +expected-checksum+ 345000001)
(declaim (ftype (function () fixnum) configured-loop-count))
(defun configured-loop-count ()
(handler-case
(let ((line (read-line *standard-input* nil nil)))
(if line
(let ((value (parse-integer line :junk-allowed t)))
(if (> value 0) value +loop-count+))
+loop-count+))
(error () +loop-count+)))
(declaim (ftype (function () string) parse-text))
(defun parse-text ()
(or (second sb-ext:*posix-argv*) "12345"))
(declaim (ftype (function (fixnum string) fixnum) parse-loop))
(defun parse-loop (limit text)
(declare (type fixnum limit)
(type string text))
(loop with i of-type fixnum = 0
with acc of-type fixnum = 1
while (< i limit)
do (let* ((next (+ acc (parse-integer text)))
(bounded (if (> next 1000000000)
(- next 1000000000)
next)))
(declare (type fixnum next bounded))
(setf acc bounded
i (+ i 1)))
finally (return acc)))
(let ((result (parse-loop (configured-loop-count) (parse-text))))
(format t "~D~%" result)
(sb-ext:exit :code (if (= result +expected-checksum+) 0 1)))