diff --git a/common_lisp/step2_eval.lisp b/common_lisp/step2_eval.lisp index 4c3a63a6..8a4e41dc 100644 --- a/common_lisp/step2_eval.lisp +++ b/common_lisp/step2_eval.lisp @@ -14,27 +14,27 @@ (setf (gethash (types:make-mal-symbol '+) *repl-env*) (types:make-mal-builtin-fn (lambda (value1 value2) - (types:make-mal-number (apply-unwrapped-values '+ - value1 - value2))))) + (apply-unwrapped-values '+ + value1 + value2)))) (setf (gethash (types:make-mal-symbol '-) *repl-env*) (types:make-mal-builtin-fn (lambda (value1 value2) - (types:make-mal-number (apply-unwrapped-values '- - value1 - value2))))) + (apply-unwrapped-values '- + value1 + value2)))) (setf (gethash (types:make-mal-symbol '*) *repl-env*) (types:make-mal-builtin-fn (lambda (value1 value2) - (types:make-mal-number (apply-unwrapped-values '* - value1 - value2))))) + (apply-unwrapped-values '* + value1 + value2)))) (setf (gethash (types:make-mal-symbol '/) *repl-env*) (types:make-mal-builtin-fn (lambda (value1 value2) - (types:make-mal-number (apply-unwrapped-values '/ - value1 - value2))))) + (apply-unwrapped-values '/ + value1 + value2)))) (defun lookup-env (symbol env) (let ((value (gethash symbol env))) diff --git a/common_lisp/types.lisp b/common_lisp/types.lisp index b97ae8ca..faa39823 100644 --- a/common_lisp/types.lisp +++ b/common_lisp/types.lisp @@ -97,4 +97,15 @@ forms)))) (defun apply-unwrapped-values (op &rest values) - (apply op (mapcar #'mal-value values))) + (let ((value (apply op (mapcar #'mal-value values)))) + (funcall (typecase value + (number #'make-mal-number) + (symbol #'make-mal-number) + (keyword #'make-mal-keyword) + (string #'make-mal-string) + (boolean #'make-mal-boolean) + (list #'make-mal-list) + (vector #'make-mal-vector) + (hash-map #'make-mal-hash-map) + (null #'make-mal-nil)) + value)))