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