Skip to content

Instantly share code, notes, and snippets.

@psilord
Created April 26, 2025 04:23
Show Gist options
  • Save psilord/006c4665e57924a950d580c5e40930f8 to your computer and use it in GitHub Desktop.
Save psilord/006c4665e57924a950d580c5e40930f8 to your computer and use it in GitHub Desktop.
(defun parse-number (str &key (package *package*) (error nil))
(with-standard-io-syntax
(with-input-from-string (s str)
(let ((*read-eval* nil)
(*package* package))
(let ((val
(restart-case
(handler-bind
((condition (lambda (c)
(invoke-restart 'bad-read error))))
(read s))
(bad-read (retval)
retval))))
(if (numberp val)
val
error))))))
;; CL-USER> (parse-number "23")
;; 23
;; CL-USER> (parse-number "23.54")
;; 23.54
;; CL-USER> (parse-number "23/23")
;; 1
;; CL-USER> (parse-number "23")
;; 23
;; CL-USER> (parse-number "23.54")
;; 23.54
;; CL-USER> (parse-number "23/2435")
;; 23/2435
;; CL-USER> (parse-number "#C(12 34)")
;; #C(12 34)
;; CL-USER> (parse-number "#.(+ 1 2 3 4)")
;; NIL
;; CL-USER> (parse-number "#.(+ 1 2 3 4)" :error :nope)
;; :NOPE
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment