(defclass annotated-evaluation () ((text :initarg :text :reader ev-text) (form :initarg :form :reader ev-form) (values :initarg :values :reader ev-values))) (defun load-file (filename) (let ((content (alexandria:read-file-into-string filename)) (pos 0) (eof (make-symbol "EOF"))) (loop for (form end-pos) = (multiple-value-list (read-from-string content nil eof :start pos)) until (eq form eof) collect (make-instance 'annotated-evaluation :text (string-trim '(#\Newline #\Space #\Tab) (subseq content pos end-pos)) :form form :values (multiple-value-list (eval form))) do (setf pos end-pos))))