(in-package :core)
-(define-condition index-error (types:mal-error)
+(define-condition index-error (mal-error)
((size :initarg :size :reader index-error-size)
(index :initarg :index :reader index-error-index)
(sequence :initarg :sequence :reader index-error-sequence))
(make-mal-list values))
(defmal list? (value)
- (wrap-boolean (or (types:mal-nil-p value) (types:mal-list-p value))))
+ (wrap-boolean (or (mal-nil-p value) (mal-list-p value))))
(defmal empty? (value)
- (wrap-boolean (zerop (length (types:mal-data-value value)))))
+ (wrap-boolean (zerop (length (mal-data-value value)))))
(defmal count (value)
(make-mal-number (length (mal-data-value value))))
(defmal = (value1 value2)
- (wrap-boolean (types:mal-data-value= value1 value2)))
+ (wrap-boolean (mal-data-value= value1 value2)))
(defmal < (value1 value2)
(wrap-boolean (< (mal-data-value value1) (mal-data-value value2))))
(wrap-boolean (>= (mal-data-value value1) (mal-data-value value2))))
(defmal read-string (value)
- (reader:read-str (types:mal-data-value value)))
+ (reader:read-str (mal-data-value value)))
(defmal slurp (filename)
(make-mal-string (read-file-string (mal-data-value filename))))
(defmal atom (value)
- (types:make-mal-atom value))
+ (make-mal-atom value))
(defmal atom? (value)
- (wrap-boolean (types:mal-atom-p value)))
+ (wrap-boolean (mal-atom-p value)))
(defmal deref (atom)
- (types:mal-data-value atom))
+ (mal-data-value atom))
(defmal reset! (atom value)
- (setf (types:mal-data-value atom) value))
+ (setf (mal-data-value atom) value))
(defmal swap! (atom fn &rest args)
- (setf (types:mal-data-value atom)
- (apply (types:mal-data-value fn)
- (append (list (types:mal-data-value atom)) args))))
+ (setf (mal-data-value atom)
+ (apply (mal-data-value fn)
+ (append (list (mal-data-value atom)) args))))
(defmal cons (element list)
- (types:make-mal-list (cons element (listify (types:mal-data-value list)))))
+ (make-mal-list (cons element (listify (mal-data-value list)))))
(defmal concat (&rest lists)
- (types:make-mal-list (apply #'concatenate 'list (mapcar #'types:mal-data-value lists))))
+ (make-mal-list (apply #'concatenate 'list (mapcar #'mal-data-value lists))))
(defmal nth (sequence index)
- (or (nth (types:mal-data-value index)
- (listify (types:mal-data-value sequence)))
+ (or (nth (mal-data-value index)
+ (listify (mal-data-value sequence)))
(error 'index-error
- :size (length (types:mal-data-value sequence))
- :index (types:mal-data-value index)
+ :size (length (mal-data-value sequence))
+ :index (mal-data-value index)
:sequence sequence)))
(defmal first (sequence)
- (or (first (listify (types:mal-data-value sequence))) mal-nil))
+ (or (first (listify (mal-data-value sequence))) mal-nil))
(defmal rest (sequence)
- (types:make-mal-list (rest (listify (types:mal-data-value sequence)))))
+ (make-mal-list (rest (listify (mal-data-value sequence)))))
(defmal throw (value)
- (error 'types:mal-user-exception :data value))
+ (error 'mal-user-exception :data value))
(defmal apply (fn &rest values)
- (let ((last (listify (types:mal-data-value (car (last values)))))
+ (let ((last (listify (mal-data-value (car (last values)))))
(butlast (butlast values)))
- (apply (types:mal-data-value fn) (append butlast last))))
+ (apply (mal-data-value fn) (append butlast last))))
(defmal map (fn sequence)
- (let ((applicants (listify (types:mal-data-value sequence))))
- (types:make-mal-list (mapcar (types:mal-data-value fn) applicants))))
+ (let ((applicants (listify (mal-data-value sequence))))
+ (make-mal-list (mapcar (mal-data-value fn) applicants))))
(defmal nil? (value)
- (wrap-boolean (types:mal-nil-p value)))
+ (wrap-boolean (mal-nil-p value)))
(defmal true? (value)
- (wrap-boolean (and (types:mal-boolean-p value) (types:mal-data-value value))))
+ (wrap-boolean (and (mal-boolean-p value) (mal-data-value value))))
(defmal false? (value)
- (wrap-boolean (and (types:mal-boolean-p value) (not (types:mal-data-value value)))))
+ (wrap-boolean (and (mal-boolean-p value) (not (mal-data-value value)))))
(defmal symbol (string)
- (types:make-mal-symbol (types:mal-data-value string)))
+ (make-mal-symbol (mal-data-value string)))
(defmal symbol? (value)
- (wrap-boolean (types:mal-symbol-p value)))
+ (wrap-boolean (mal-symbol-p value)))
(defmal keyword (keyword)
- (if (types:mal-keyword-p keyword)
+ (if (mal-keyword-p keyword)
keyword
- (types:make-mal-keyword (format nil ":~a" (types:mal-data-value keyword)))))
+ (make-mal-keyword (format nil ":~a" (mal-data-value keyword)))))
(defmal keyword? (value)
- (wrap-boolean (types:mal-keyword-p value)))
+ (wrap-boolean (mal-keyword-p value)))
(defmal vector (&rest elements)
- (types:make-mal-vector (map 'vector #'identity elements)))
+ (make-mal-vector (map 'vector #'identity elements)))
(defmal vector? (value)
- (wrap-boolean (types:mal-vector-p value)))
+ (wrap-boolean (mal-vector-p value)))
(defmal hash-map (&rest elements)
- (let ((hash-map (types:make-mal-value-hash-table)))
+ (let ((hash-map (make-mal-value-hash-table)))
(loop for (key value) on elements
by #'cddr
- do (setf (genhash:hashref key hash-map) value))
- (types:make-mal-hash-map hash-map)))
+ do (setf (hashref key hash-map) value))
+ (make-mal-hash-map hash-map)))
(defmal map? (value)
- (wrap-boolean (types:mal-hash-map-p value)))
+ (wrap-boolean (mal-hash-map-p value)))
(defmal assoc (hash-map &rest elements)
- (let ((hash-map-value (types:mal-data-value hash-map))
- (new-hash-map (types:make-mal-value-hash-table)))
+ (let ((hash-map-value (mal-data-value hash-map))
+ (new-hash-map (make-mal-value-hash-table)))
- (genhash:hashmap (lambda (key value)
- (declare (ignorable value))
- (setf (genhash:hashref key new-hash-map)
- (genhash:hashref key hash-map-value)))
- hash-map-value)
+ (hashmap (lambda (key value)
+ (declare (ignorable value))
+ (setf (hashref key new-hash-map)
+ (hashref key hash-map-value)))
+ hash-map-value)
(loop for (key value) on elements
by #'cddr
- do (setf (genhash:hashref key new-hash-map) value))
+ do (setf (hashref key new-hash-map) value))
- (types:make-mal-hash-map new-hash-map)))
+ (make-mal-hash-map new-hash-map)))
(defmal dissoc (hash-map &rest elements)
(let ((hash-map-value (mal-data-value hash-map))
(make-mal-hash-map new-hash-map)))
(defmal get (hash-map key)
- (or (and (types:mal-hash-map-p hash-map) (genhash:hashref key (types:mal-data-value hash-map)))
+ (or (and (mal-hash-map-p hash-map) (hashref key (mal-data-value hash-map)))
types:mal-nil))
(defmal contains? (hash-map key)
(if (genhash:hashref key (types:mal-data-value hash-map)) types:mal-true types:mal-false))
(defmal keys (hash-map)
- (let ((hash-map-value (types:mal-data-value hash-map))
+ (let ((hash-map-value (mal-data-value hash-map))
keys)
(hashmap (lambda (key value)
(make-mal-list (nreverse keys))))
(defmal vals (hash-map)
- (let ((hash-map-value (types:mal-data-value hash-map))
+ (let ((hash-map-value (mal-data-value hash-map))
values)
(hashmap (lambda (key value)
(make-mal-list (nreverse values))))
(defmal sequential? (value)
- (wrap-boolean (or (types:mal-vector-p value) (types:mal-list-p value))))
+ (wrap-boolean (or (mal-vector-p value) (mal-list-p value))))
(defmal readline (prompt)
- (format *standard-output* (types:mal-data-value prompt))
+ (format *standard-output* (mal-data-value prompt))
(force-output *standard-output*)
(make-mal-string (read-line *standard-input* nil)))
(defmal string? (value)
- (wrap-boolean (types:mal-string-p value)))
+ (wrap-boolean (mal-string-p value)))
(defmal time-ms ()
- (types:make-mal-number (round (/ (get-internal-real-time)
- (/ internal-time-units-per-second
- 1000)))))
+ (make-mal-number (round (/ (get-internal-real-time)
+ (/ internal-time-units-per-second
+ 1000)))))
(defmal conj (value &rest elements)
- (cond ((types:mal-list-p value)
- (types:make-mal-list (append (nreverse elements)
- (types:mal-data-value value))))
- ((types:mal-vector-p value)
- (types:make-mal-vector (concatenate 'vector
- (types:mal-data-value value)
- elements)))
- (t (error 'types:mal-user-exception))))
+ (cond ((mal-list-p value)
+ (make-mal-list (append (nreverse elements)
+ (mal-data-value value))))
+ ((mal-vector-p value)
+ (make-mal-vector (concatenate 'vector
+ (mal-data-value value)
+ elements)))
+ (t (error 'mal-user-exception))))
(defmal seq (value)
(if (zerop (length (mal-data-value value)))
(defmal with-meta (value meta)
(funcall (switch-mal-type value
- (types:string #'types:make-mal-string)
- (types:symbol #'types:make-mal-symbol)
- (types:list #'types:make-mal-list)
- (types:vector #'types:make-mal-vector)
- (types:hash-map #'types:make-mal-hash-map)
- (types:fn #'types:make-mal-fn)
- (types:builtin-fn #'types:make-mal-builtin-fn))
- (types:mal-data-value value)
+ (types:string #'make-mal-string)
+ (types:symbol #'make-mal-symbol)
+ (types:list #'make-mal-list)
+ (types:vector #'make-mal-vector)
+ (types:hash-map #'make-mal-hash-map)
+ (types:fn #'make-mal-fn)
+ (types:builtin-fn #'make-mal-builtin-fn))
+ (mal-data-value value)
:meta meta
- :attrs (types:mal-data-attrs value)))
+ :attrs (mal-data-attrs value)))
(defmal meta (value)
(or (types:mal-data-meta value) types:mal-nil))
(in-package :env)
-(define-condition undefined-symbol (types:mal-runtime-exception)
+(define-condition undefined-symbol (mal-runtime-exception)
((symbol :initarg :symbol :reader symbol))
(:report (lambda (condition stream)
(format stream
"'~a' not found"
(symbol condition)))))
-(define-condition arity-mismatch (types:mal-runtime-exception)
+(define-condition arity-mismatch (mal-runtime-exception)
((required :initarg :required :reader required)
(provided :initarg :provided :reader provided))
(:report (lambda (condition stream)
:symbol (format nil "~a" (mal-data-value symbol)))))
(defun set-env (env symbol value)
- (setf (gethash (types:mal-data-value symbol)
- (mal-env-bindings env))
- value))
+ (setf (gethash (mal-data-value symbol) (mal-env-bindings env)) value))
(defun create-mal-env (&key parent binds exprs)
(let ((env (make-mal-env :parent parent))
start-delimiter
(mapcar (lambda (value)
(pr-str value print-readably))
- (utils:listify (types:mal-data-value sequence)))
+ (listify (mal-data-value sequence)))
end-delimiter))
(defun pr-mal-hash-map (hash-map &optional (print-readably t) &aux repr)
- (genhash:hashmap (lambda (key value)
- (push (pr-str value print-readably) repr)
- (push (pr-str key print-readably) repr))
- (types:mal-data-value hash-map))
+ (hashmap (lambda (key value)
+ (push (pr-str value print-readably) repr)
+ (push (pr-str key print-readably) repr))
+ (mal-data-value hash-map))
(format nil "{~{~a ~a~^ ~}}" repr))
(defun pr-string (ast &optional (print-readably t))
- (if print-readably
- (utils:replace-all (prin1-to-string (types:mal-data-value ast))
- "
+ (if print-readably
+ (replace-all (prin1-to-string (mal-data-value ast))
+ "
"
- "\\n")
- (types:mal-data-value ast)))
+ "\\n")
+ (mal-data-value ast)))
(defun pr-str (ast &optional (print-readably t))
(when ast
(switch-mal-type ast
- (types:number (format nil "~d" (types:mal-data-value ast)))
- (types:boolean (if (types:mal-data-value ast) "true" "false"))
+ (types:number (format nil "~d" (mal-data-value ast)))
+ (types:boolean (if (mal-data-value ast) "true" "false"))
(types:nil "nil")
(types:string (pr-string ast print-readably))
- (types:symbol (format nil "~a" (types:mal-data-value ast)))
- (types:keyword (format nil "~a" (types:mal-data-value ast)))
+ (types:symbol (format nil "~a" (mal-data-value ast)))
+ (types:keyword (format nil "~a" (mal-data-value ast)))
(types:list (pr-mal-sequence "(" ast ")" print-readably))
(types:vector (pr-mal-sequence "[" ast "]" print-readably))
(types:hash-map (pr-mal-hash-map ast print-readably))
- (types:atom (format nil "(atom ~a)" (pr-str (types:mal-data-value ast))))
+ (types:atom (format nil "(atom ~a)" (pr-str (mal-data-value ast))))
(types:builtin-fn "#<func>")
(types:builtin-fn "#<builtin-func>"))))
(defun mal-readline (prompt)
(if *use-readline-p*
- (cl-readline:readline :prompt prompt
+ (rl:readline :prompt prompt
:add-history t
:novelty-check (lambda (old new)
(not (string= old new))))
(defun rep (string)
(handler-case
- (mal-print (mal-eval (mal-read string)
- (make-hash-table :test #'equal)))
+ (mal-print (mal-eval (mal-read string) (make-hash-table :test #'equal)))
(reader:eof (condition)
- (format nil
- "~a"
- condition))))
+ (format nil "~a" condition))))
(defvar *use-readline-p* nil)
(defun mal-readline (prompt)
(if *use-readline-p*
- (cl-readline:readline :prompt prompt
+ (rl:readline :prompt prompt
:add-history t
:novelty-check (lambda (old new)
(not (string= old new))))
(in-package :mal)
-(defvar *repl-env* (types:make-mal-value-hash-table))
+(defvar *repl-env* (make-mal-value-hash-table))
-(setf (genhash:hashref (types:make-mal-symbol "+") *repl-env*)
- (types:make-mal-builtin-fn (lambda (value1 value2)
+(setf (genhash:hashref (make-mal-symbol "+") *repl-env*)
+ (make-mal-builtin-fn (lambda (value1 value2)
(make-mal-number (+ (mal-data-value value1)
(mal-data-value value2))))))
-(setf (genhash:hashref (types:make-mal-symbol "-") *repl-env*)
- (types:make-mal-builtin-fn (lambda (value1 value2)
+(setf (genhash:hashref (make-mal-symbol "-") *repl-env*)
+ (make-mal-builtin-fn (lambda (value1 value2)
(make-mal-number (- (mal-data-value value1)
(mal-data-value value2))))))
-(setf (genhash:hashref (types:make-mal-symbol "*") *repl-env*)
- (types:make-mal-builtin-fn (lambda (value1 value2)
+(setf (genhash:hashref (make-mal-symbol "*") *repl-env*)
+ (make-mal-builtin-fn (lambda (value1 value2)
(make-mal-number (* (mal-data-value value1)
(mal-data-value value2))))))
-(setf (genhash:hashref (types:make-mal-symbol "/") *repl-env*)
- (types:make-mal-builtin-fn (lambda (value1 value2)
+(setf (genhash:hashref (make-mal-symbol "/") *repl-env*)
+ (make-mal-builtin-fn (lambda (value1 value2)
(make-mal-number (/ (mal-data-value value1)
(mal-data-value value2))))))
(if value
value
(error 'env:undefined-symbol
- :symbol (format nil "~a" (types:mal-data-value symbol))))))
+ :symbol (format nil "~a" (mal-data-value symbol))))))
(defun eval-sequence (sequence env)
(map 'list
(lambda (ast) (mal-eval ast env))
- (types:mal-data-value sequence)))
+ (mal-data-value sequence)))
(defun eval-hash-map (hash-map env)
- (let ((hash-map-value (types:mal-data-value hash-map))
- (new-hash-table (types:make-mal-value-hash-table)))
+ (let ((hash-map-value (mal-data-value hash-map))
+ (new-hash-table (make-mal-value-hash-table)))
(genhash:hashmap (lambda (key value)
(setf (genhash:hashref (mal-eval key env) new-hash-table)
(mal-eval value env)))
hash-map-value)
- (types:make-mal-hash-map new-hash-table)))
+ (make-mal-hash-map new-hash-table)))
(defun eval-ast (ast env)
(switch-mal-type ast
(defun mal-eval (ast env)
(cond
- ((not (types:mal-list-p ast)) (eval-ast ast env))
- ((zerop (length (types:mal-data-value ast))) ast)
+ ((not (mal-list-p ast)) (eval-ast ast env))
+ ((zerop (length (mal-data-value ast))) ast)
(t (progn
(let ((evaluated-list (eval-ast ast env)))
- (apply (types:mal-data-value (car evaluated-list))
+ (apply (mal-data-value (car evaluated-list))
(cdr evaluated-list)))))))
(defun mal-print (expression)
(defun rep (string)
(handler-case
- (mal-print (mal-eval (mal-read string)
- *repl-env*))
+ (mal-print (mal-eval (mal-read string) *repl-env*))
(error (condition)
- (format nil
- "~a"
- condition))))
+ (format nil "~a" condition))))
(defvar *use-readline-p* nil)
(defun mal-readline (prompt)
(if *use-readline-p*
- (cl-readline:readline :prompt prompt
+ (rl:readline :prompt prompt
:add-history t
:novelty-check (lambda (old new)
(not (string= old new))))
(defvar *repl-env* (env:create-mal-env))
(env:set-env *repl-env*
- (types:make-mal-symbol "+")
- (types:make-mal-builtin-fn (lambda (value1 value2)
- (make-mal-number (+ (mal-data-value value1)
- (mal-data-value value2))))))
+ (make-mal-symbol "+")
+ (make-mal-builtin-fn (lambda (value1 value2)
+ (make-mal-number (+ (mal-data-value value1)
+ (mal-data-value value2))))))
(env:set-env *repl-env*
- (types:make-mal-symbol "-")
- (types:make-mal-builtin-fn (lambda (value1 value2)
- (make-mal-number (- (mal-data-value value1)
- (mal-data-value value2))))))
+ (make-mal-symbol "-")
+ (make-mal-builtin-fn (lambda (value1 value2)
+ (make-mal-number (- (mal-data-value value1)
+ (mal-data-value value2))))))
(env:set-env *repl-env*
- (types:make-mal-symbol "*")
- (types:make-mal-builtin-fn (lambda (value1 value2)
- (make-mal-number (* (mal-data-value value1)
- (mal-data-value value2))))))
+ (make-mal-symbol "*")
+ (make-mal-builtin-fn (lambda (value1 value2)
+ (make-mal-number (* (mal-data-value value1)
+ (mal-data-value value2))))))
(env:set-env *repl-env*
- (types:make-mal-symbol "/")
- (types:make-mal-builtin-fn (lambda (value1 value2)
- (make-mal-number (/ (mal-data-value value1)
- (mal-data-value value2))))))
+ (make-mal-symbol "/")
+ (make-mal-builtin-fn (lambda (value1 value2)
+ (make-mal-number (/ (mal-data-value value1)
+ (mal-data-value value2))))))
(defvar mal-def! (make-mal-symbol "def!"))
(defvar mal-let* (make-mal-symbol "let*"))
(defun eval-sequence (sequence env)
(map 'list
(lambda (ast) (mal-eval ast env))
- (types:mal-data-value sequence)))
+ (mal-data-value sequence)))
(defun eval-hash-map (hash-map env)
- (let ((hash-map-value (types:mal-data-value hash-map))
- (new-hash-table (types:make-mal-value-hash-table)))
+ (let ((hash-map-value (mal-data-value hash-map))
+ (new-hash-table (make-mal-value-hash-table)))
(genhash:hashmap (lambda (key value)
(setf (genhash:hashref (mal-eval key env) new-hash-table)
(mal-eval value env)))
hash-map-value)
- (types:make-mal-hash-map new-hash-table)))
+ (make-mal-hash-map new-hash-table)))
(defun eval-ast (ast env)
(switch-mal-type ast
(defun eval-let* (forms env)
(let ((new-env (env:create-mal-env :parent env))
- (bindings (utils:listify (types:mal-data-value (second forms)))))
+ (bindings (utils:listify (mal-data-value (second forms)))))
(mapcar (lambda (binding)
(env:set-env new-env
(car binding)
(mal-eval (or (cdr binding)
- types:mal-nil)
+ mal-nil)
new-env)))
(loop
for (symbol value) on bindings
((mal-data-value= mal-let* (first forms))
(eval-let* forms env))
(t (let ((evaluated-list (eval-ast ast env)))
- (apply (types:mal-data-value (car evaluated-list))
+ (apply (mal-data-value (car evaluated-list))
(cdr evaluated-list)))))))
(defun mal-read (string)
(defun mal-eval (ast env)
(cond
- ((null ast) types:mal-nil)
- ((not (types:mal-list-p ast)) (eval-ast ast env))
+ ((null ast) mal-nil)
+ ((not (mal-list-p ast)) (eval-ast ast env))
((zerop (length (mal-data-value ast))) ast)
(t (eval-list ast env))))
(defun rep (string)
(handler-case
- (mal-print (mal-eval (mal-read string)
- *repl-env*))
+ (mal-print (mal-eval (mal-read string) *repl-env*))
(error (condition)
- (format nil
- "~a"
- condition))))
+ (format nil "~a" condition))))
(defvar *use-readline-p* nil)
(defun mal-readline (prompt)
(if *use-readline-p*
- (cl-readline:readline :prompt prompt
+ (rl:readline :prompt prompt
:add-history t
:novelty-check (lambda (old new)
(not (string= old new))))
(defvar *repl-env* (env:create-mal-env))
(dolist (binding core:ns)
- (env:set-env *repl-env*
- (car binding)
- (cdr binding)))
+ (env:set-env *repl-env* (car binding) (cdr binding)))
(defvar mal-def! (make-mal-symbol "def!"))
(defvar mal-let* (make-mal-symbol "let*"))
(mal-data-value sequence)))
(defun eval-hash-map (hash-map env)
- (let ((hash-map-value (types:mal-data-value hash-map))
- (new-hash-table (types:make-mal-value-hash-table)))
+ (let ((hash-map-value (mal-data-value hash-map))
+ (new-hash-table (make-mal-value-hash-table)))
(genhash:hashmap (lambda (key value)
(setf (genhash:hashref (mal-eval key env) new-hash-table)
(mal-eval value env)))
hash-map-value)
- (types:make-mal-hash-map new-hash-table)))
+ (make-mal-hash-map new-hash-table)))
(defun eval-ast (ast env)
(switch-mal-type ast
(defun eval-let* (forms env)
(let ((new-env (env:create-mal-env :parent env))
- (bindings (utils:listify (types:mal-data-value (second forms)))))
+ (bindings (utils:listify (mal-data-value (second forms)))))
(mapcar (lambda (binding)
(env:set-env new-env
(car binding)
(mal-eval (or (cdr binding)
- types:mal-nil)
+ mal-nil)
new-env)))
(loop
for (symbol value) on bindings
(cdr forms)))))
((mal-data-value= mal-if (first forms))
(let ((predicate (mal-eval (second forms) env)))
- (mal-eval (if (or (mal-data-value= predicate types:mal-nil)
- (mal-data-value= predicate types:mal-false))
+ (mal-eval (if (or (mal-data-value= predicate mal-nil)
+ (mal-data-value= predicate mal-false))
(fourth forms)
(third forms))
env)))
((mal-data-value= mal-fn* (first forms))
- (types:make-mal-fn (let ((arglist (second forms))
+ (make-mal-fn (let ((arglist (second forms))
(body (third forms)))
(lambda (&rest args)
(mal-eval body (env:create-mal-env :parent env
- :binds (map 'list
- #'identity
- (mal-data-value arglist))
+ :binds (listify (mal-data-value arglist))
:exprs args))))))
(t (let* ((evaluated-list (eval-ast ast env))
(function (car evaluated-list)))
(defun mal-eval (ast env)
(cond
- ((null ast) types:mal-nil)
- ((not (types:mal-list-p ast)) (eval-ast ast env))
+ ((null ast) mal-nil)
+ ((not (mal-list-p ast)) (eval-ast ast env))
((zerop (length (mal-data-value ast))) ast)
(t (eval-list ast env))))
(defun rep (string)
(handler-case
- (mal-print (mal-eval (mal-read string)
- *repl-env*))
+ (mal-print (mal-eval (mal-read string) *repl-env*))
(error (condition)
- (format nil
- "~a"
- condition))))
+ (format nil "~a" condition))))
(rep "(def! not (fn* (a) (if a false true)))")
(defun mal-readline (prompt)
(if *use-readline-p*
- (cl-readline:readline :prompt prompt
+ (rl:readline :prompt prompt
:add-history t
:novelty-check (lambda (old new)
(not (string= old new))))
(defvar *repl-env* (env:create-mal-env))
(dolist (binding core:ns)
- (env:set-env *repl-env*
- (car binding)
- (cdr binding)))
+ (env:set-env *repl-env* (car binding) (cdr binding)))
(defvar mal-def! (make-mal-symbol "def!"))
(defvar mal-let* (make-mal-symbol "let*"))
(mal-data-value sequence)))
(defun eval-hash-map (hash-map env)
- (let ((hash-map-value (types:mal-data-value hash-map))
- (new-hash-table (types:make-mal-value-hash-table)))
+ (let ((hash-map-value (mal-data-value hash-map))
+ (new-hash-table (make-mal-value-hash-table)))
(genhash:hashmap (lambda (key value)
(setf (genhash:hashref (mal-eval key env) new-hash-table)
(mal-eval value env)))
hash-map-value)
- (types:make-mal-hash-map new-hash-table)))
+ (make-mal-hash-map new-hash-table)))
(defun eval-ast (ast env)
(switch-mal-type ast
(defun mal-eval (ast env)
(loop
do (cond
- ((null ast) (return types:mal-nil))
- ((not (types:mal-list-p ast)) (return (eval-ast ast env)))
+ ((null ast) (return mal-nil))
+ ((not (mal-list-p ast)) (return (eval-ast ast env)))
((zerop (length (mal-data-value ast))) (return ast))
(t (let ((forms (mal-data-value ast)))
(cond
((mal-data-value= mal-let* (first forms))
(let ((new-env (env:create-mal-env :parent env))
- (bindings (utils:listify (types:mal-data-value (second forms)))))
+ (bindings (utils:listify (mal-data-value (second forms)))))
(mapcar (lambda (binding)
(env:set-env new-env
(car binding)
(mal-eval (or (cdr binding)
- types:mal-nil)
+ mal-nil)
new-env)))
(loop
for (symbol value) on bindings
((mal-data-value= mal-if (first forms))
(let ((predicate (mal-eval (second forms) env)))
- (setf ast (if (or (mal-data-value= predicate types:mal-nil)
- (mal-data-value= predicate types:mal-false))
+ (setf ast (if (or (mal-data-value= predicate mal-nil)
+ (mal-data-value= predicate mal-false))
(fourth forms)
(third forms)))))
((mal-data-value= mal-fn* (first forms))
(return (let ((arglist (second forms))
(body (third forms)))
- (types:make-mal-fn (lambda (&rest args)
- (mal-eval body (env:create-mal-env :parent env
- :binds (map 'list
- #'identity
- (mal-data-value arglist))
- :exprs args)))
- :attrs (list (cons 'params arglist)
- (cons 'ast body)
- (cons 'env env))))))
+ (make-mal-fn (lambda (&rest args)
+ (mal-eval body (env:create-mal-env :parent env
+ :binds (listify (mal-data-value arglist))
+ :exprs args)))
+ :attrs (list (cons 'params arglist)
+ (cons 'ast body)
+ (cons 'env env))))))
(t (let* ((evaluated-list (eval-ast ast env))
(function (car evaluated-list)))
;; If first element is a mal function unwrap it
- (if (not (types:mal-fn-p function))
+ (if (not (mal-fn-p function))
(return (apply (mal-data-value function)
(cdr evaluated-list)))
- (let* ((attrs (types:mal-data-attrs function)))
+ (let* ((attrs (mal-data-attrs function)))
(setf ast (cdr (assoc 'ast attrs))
env (env:create-mal-env :parent (cdr (assoc 'env attrs))
:binds (map 'list
(defun rep (string)
(handler-case
- (mal-print (mal-eval (mal-read string)
- *repl-env*))
+ (mal-print (mal-eval (mal-read string) *repl-env*))
(error (condition)
- (format nil
- "~a"
- condition))))
+ (format nil "~a" condition))))
(rep "(def! not (fn* (a) (if a false true)))")
(defun mal-readline (prompt)
(if *use-readline-p*
- (cl-readline:readline :prompt prompt
+ (rl:readline :prompt prompt
:add-history t
:novelty-check (lambda (old new)
(not (string= old new))))
(defvar *repl-env* (env:create-mal-env))
(dolist (binding core:ns)
- (env:set-env *repl-env*
- (car binding)
- (cdr binding)))
+ (env:set-env *repl-env* (car binding) (cdr binding)))
(defvar mal-def! (make-mal-symbol "def!"))
(defvar mal-let* (make-mal-symbol "let*"))
(mal-data-value sequence)))
(defun eval-hash-map (hash-map env)
- (let ((hash-map-value (types:mal-data-value hash-map))
- (new-hash-table (types:make-mal-value-hash-table)))
+ (let ((hash-map-value (mal-data-value hash-map))
+ (new-hash-table (make-mal-value-hash-table)))
(genhash:hashmap (lambda (key value)
(setf (genhash:hashref (mal-eval key env) new-hash-table)
(mal-eval value env)))
hash-map-value)
- (types:make-mal-hash-map new-hash-table)))
+ (make-mal-hash-map new-hash-table)))
(defun eval-ast (ast env)
(switch-mal-type ast
(defun mal-eval (ast env)
(loop
do (cond
- ((null ast) (return types:mal-nil))
- ((not (types:mal-list-p ast)) (return (eval-ast ast env)))
+ ((null ast) (return mal-nil))
+ ((not (mal-list-p ast)) (return (eval-ast ast env)))
((zerop (length (mal-data-value ast))) (return ast))
(t (let ((forms (mal-data-value ast)))
(cond
((mal-data-value= mal-let* (first forms))
(let ((new-env (env:create-mal-env :parent env))
- (bindings (utils:listify (types:mal-data-value (second forms)))))
+ (bindings (utils:listify (mal-data-value (second forms)))))
(mapcar (lambda (binding)
(env:set-env new-env
(car binding)
(mal-eval (or (cdr binding)
- types:mal-nil)
+ mal-nil)
new-env)))
(loop
for (symbol value) on bindings
((mal-data-value= mal-if (first forms))
(let ((predicate (mal-eval (second forms) env)))
- (setf ast (if (or (mal-data-value= predicate types:mal-nil)
- (mal-data-value= predicate types:mal-false))
+ (setf ast (if (or (mal-data-value= predicate mal-nil)
+ (mal-data-value= predicate mal-false))
(fourth forms)
(third forms)))))
((mal-data-value= mal-fn* (first forms))
(return (let ((arglist (second forms))
(body (third forms)))
- (types:make-mal-fn (lambda (&rest args)
+ (make-mal-fn (lambda (&rest args)
(mal-eval body (env:create-mal-env :parent env
- :binds (map 'list
- #'identity
- (mal-data-value arglist))
+ :binds (listify (mal-data-value arglist))
:exprs args)))
:attrs (list (cons 'params arglist)
(cons 'ast body)
(t (let* ((evaluated-list (eval-ast ast env))
(function (car evaluated-list)))
;; If first element is a mal function unwrap it
- (if (not (types:mal-fn-p function))
+ (if (not (mal-fn-p function))
(return (apply (mal-data-value function)
(cdr evaluated-list)))
- (let* ((attrs (types:mal-data-attrs function)))
+ (let* ((attrs (mal-data-attrs function)))
(setf ast (cdr (assoc 'ast attrs))
env (env:create-mal-env :parent (cdr (assoc 'env attrs))
:binds (map 'list
(defun rep (string)
(handler-case
- (mal-print (mal-eval (mal-read string)
- *repl-env*))
+ (mal-print (mal-eval (mal-read string) *repl-env*))
(error (condition)
- (format nil
- "~a"
- condition))))
+ (format nil "~a" condition))))
(env:set-env *repl-env*
- (types:make-mal-symbol "eval")
- (types:make-mal-builtin-fn (lambda (ast)
+ (make-mal-symbol "eval")
+ (make-mal-builtin-fn (lambda (ast)
(mal-eval ast *repl-env*))))
(rep "(def! not (fn* (a) (if a false true)))")
(defun mal-readline (prompt)
(if *use-readline-p*
- (cl-readline:readline :prompt prompt
+ (rl:readline :prompt prompt
:add-history t
:novelty-check (lambda (old new)
(not (string= old new))))
argv
(cdr (utils:raw-command-line-arguments)))))
(env:set-env *repl-env*
- (types:make-mal-symbol "*ARGV*")
+ (make-mal-symbol "*ARGV*")
(make-mal-list (mapcar #'make-mal-string (cdr args))))
(if (null args)
(repl)
(defvar *repl-env* (env:create-mal-env))
(dolist (binding core:ns)
- (env:set-env *repl-env*
- (car binding)
- (cdr binding)))
+ (env:set-env *repl-env* (car binding) (cdr binding)))
(defvar mal-def! (make-mal-symbol "def!"))
(defvar mal-let* (make-mal-symbol "let*"))
(mal-data-value sequence)))
(defun eval-hash-map (hash-map env)
- (let ((hash-map-value (types:mal-data-value hash-map))
- (new-hash-table (types:make-mal-value-hash-table)))
+ (let ((hash-map-value (mal-data-value hash-map))
+ (new-hash-table (make-mal-value-hash-table)))
(genhash:hashmap (lambda (key value)
(setf (genhash:hashref (mal-eval key env) new-hash-table)
(mal-eval value env)))
hash-map-value)
- (types:make-mal-hash-map new-hash-table)))
+ (make-mal-hash-map new-hash-table)))
(defun eval-ast (ast env)
(switch-mal-type ast
(defun is-pair (value)
(and (or (mal-list-p value)
(mal-vector-p value))
- (< 0 (length (types:mal-data-value value)))))
+ (< 0 (length (mal-data-value value)))))
(defun quasiquote (ast)
(if (not (is-pair ast))
- (types:make-mal-list (list mal-quote ast))
+ (make-mal-list (list mal-quote ast))
(let ((forms (map 'list #'identity (mal-data-value ast))))
(cond
((mal-data-value= mal-unquote (first forms))
((and (is-pair (first forms))
(mal-data-value= mal-splice-unquote
- (first (mal-data-value (first forms)))))
- (types:make-mal-list (list mal-concat
- (second (mal-data-value (first forms)))
- (quasiquote (make-mal-list (cdr forms))))))
+ (first (mal-data-value (first forms)))))
+ (make-mal-list (list mal-concat
+ (second (mal-data-value (first forms)))
+ (quasiquote (make-mal-list (cdr forms))))))
- (t (types:make-mal-list (list mal-cons
- (quasiquote (first forms))
- (quasiquote (make-mal-list (cdr forms))))))))))
+ (t (make-mal-list (list mal-cons
+ (quasiquote (first forms))
+ (quasiquote (make-mal-list (cdr forms))))))))))
(defun mal-read (string)
(reader:read-str string))
(defun mal-eval (ast env)
(loop
do (cond
- ((null ast) (return types:mal-nil))
- ((not (types:mal-list-p ast)) (return (eval-ast ast env)))
+ ((null ast) (return mal-nil))
+ ((not (mal-list-p ast)) (return (eval-ast ast env)))
((zerop (length (mal-data-value ast))) (return ast))
(t (let ((forms (mal-data-value ast)))
(cond
((mal-data-value= mal-let* (first forms))
(let ((new-env (env:create-mal-env :parent env))
- (bindings (utils:listify (types:mal-data-value (second forms)))))
+ (bindings (utils:listify (mal-data-value (second forms)))))
(mapcar (lambda (binding)
(env:set-env new-env
(car binding)
(mal-eval (or (cdr binding)
- types:mal-nil)
+ mal-nil)
new-env)))
(loop
for (symbol value) on bindings
((mal-data-value= mal-if (first forms))
(let ((predicate (mal-eval (second forms) env)))
- (setf ast (if (or (mal-data-value= predicate types:mal-nil)
- (mal-data-value= predicate types:mal-false))
+ (setf ast (if (or (mal-data-value= predicate mal-nil)
+ (mal-data-value= predicate mal-false))
(fourth forms)
(third forms)))))
((mal-data-value= mal-fn* (first forms))
(return (let ((arglist (second forms))
(body (third forms)))
- (types:make-mal-fn (lambda (&rest args)
- (mal-eval body (env:create-mal-env :parent env
- :binds (map 'list
- #'identity
- (mal-data-value arglist))
- :exprs args)))
- :attrs (list (cons 'params arglist)
- (cons 'ast body)
- (cons 'env env))))))
+ (make-mal-fn (lambda (&rest args)
+ (mal-eval body (env:create-mal-env :parent env
+ :binds (listify (mal-data-value arglist))
+ :exprs args)))
+ :attrs (list (cons 'params arglist)
+ (cons 'ast body)
+ (cons 'env env))))))
(t (let* ((evaluated-list (eval-ast ast env))
(function (car evaluated-list)))
;; If first element is a mal function unwrap it
- (if (not (types:mal-fn-p function))
+ (if (not (mal-fn-p function))
(return (apply (mal-data-value function)
(cdr evaluated-list)))
- (let* ((attrs (types:mal-data-attrs function)))
+ (let* ((attrs (mal-data-attrs function)))
(setf ast (cdr (assoc 'ast attrs))
env (env:create-mal-env :parent (cdr (assoc 'env attrs))
:binds (map 'list
(defun rep (string)
(handler-case
- (mal-print (mal-eval (mal-read string)
- *repl-env*))
+ (mal-print (mal-eval (mal-read string) *repl-env*))
(error (condition)
- (format nil
- "~a"
- condition))))
+ (format nil "~a" condition))))
(env:set-env *repl-env*
- (types:make-mal-symbol "eval")
- (types:make-mal-builtin-fn (lambda (ast)
- (mal-eval ast *repl-env*))))
+ (make-mal-symbol "eval")
+ (make-mal-builtin-fn (lambda (ast)
+ (mal-eval ast *repl-env*))))
(rep "(def! not (fn* (a) (if a false true)))")
(rep "(def! load-file (fn* (f) (eval (read-string (str \"(do \" (slurp f) \")\")))))")
(defun mal-readline (prompt)
(if *use-readline-p*
- (cl-readline:readline :prompt prompt
+ (rl:readline :prompt prompt
:add-history t
:novelty-check (lambda (old new)
(not (string= old new))))
argv
(cdr (utils:raw-command-line-arguments)))))
(env:set-env *repl-env*
- (types:make-mal-symbol "*ARGV*")
+ (make-mal-symbol "*ARGV*")
(make-mal-list (mapcar #'make-mal-string (cdr args))))
(if (null args)
(repl)
(in-package :mal)
-(define-condition invalid-function (types:mal-runtime-exception)
+(define-condition invalid-function (mal-runtime-exception)
((form :initarg :form :reader form)
(context :initarg :context :reader context))
(:report (lambda (condition stream)
(defvar *repl-env* (env:create-mal-env))
(dolist (binding core:ns)
- (env:set-env *repl-env*
- (car binding)
- (cdr binding)))
+ (env:set-env *repl-env* (car binding) (cdr binding)))
(defvar mal-def! (make-mal-symbol "def!"))
(defvar mal-let* (make-mal-symbol "let*"))
(defun eval-sequence (sequence env)
(map 'list
(lambda (ast) (mal-eval ast env))
- (types:mal-data-value sequence)))
+ (mal-data-value sequence)))
(defun eval-hash-map (hash-map env)
- (let ((hash-map-value (types:mal-data-value hash-map))
- (new-hash-table (types:make-mal-value-hash-table)))
+ (let ((hash-map-value (mal-data-value hash-map))
+ (new-hash-table (make-mal-value-hash-table)))
(genhash:hashmap (lambda (key value)
(setf (genhash:hashref (mal-eval key env) new-hash-table)
(mal-eval value env)))
hash-map-value)
- (types:make-mal-hash-map new-hash-table)))
+ (make-mal-hash-map new-hash-table)))
(defun eval-ast (ast env)
(switch-mal-type ast
(defun is-pair (value)
(and (or (mal-list-p value)
(mal-vector-p value))
- (< 0 (length (types:mal-data-value value)))))
+ (< 0 (length (mal-data-value value)))))
(defun quasiquote (ast)
(if (not (is-pair ast))
- (types:make-mal-list (list mal-quote ast))
- (let ((forms (map 'list #'identity (types:mal-data-value ast))))
+ (make-mal-list (list mal-quote ast))
+ (let ((forms (map 'list #'identity (mal-data-value ast))))
(cond
- ((types:mal-data-value= mal-unquote (first forms))
+ ((mal-data-value= mal-unquote (first forms))
(second forms))
((and (is-pair (first forms))
- (types:mal-data-value= mal-splice-unquote
- (first (types:mal-data-value (first forms)))))
- (types:make-mal-list (list mal-concat
- (second (types:mal-data-value (first forms)))
- (quasiquote (make-mal-list (cdr forms))))))
+ (mal-data-value= mal-splice-unquote
+ (first (mal-data-value (first forms)))))
+ (make-mal-list (list mal-concat
+ (second (mal-data-value (first forms)))
+ (quasiquote (make-mal-list (cdr forms))))))
- (t (types:make-mal-list (list mal-cons
- (quasiquote (first forms))
- (quasiquote (make-mal-list (cdr forms))))))))))
+ (t (make-mal-list (list mal-cons
+ (quasiquote (first forms))
+ (quasiquote (make-mal-list (cdr forms))))))))))
(defun is-macro-call (ast env)
- (when (types:mal-list-p ast)
- (let* ((func-symbol (first (types:mal-data-value ast)))
- (func (when (types:mal-symbol-p func-symbol)
+ (when (mal-list-p ast)
+ (let* ((func-symbol (first (mal-data-value ast)))
+ (func (when (mal-symbol-p func-symbol)
(env:find-env env func-symbol))))
(and func
- (types:mal-fn-p func)
- (cdr (assoc 'is-macro (types:mal-data-attrs func)))))))
+ (mal-fn-p func)
+ (cdr (assoc 'is-macro (mal-data-attrs func)))))))
(defun mal-macroexpand (ast env)
(loop
while (is-macro-call ast env)
- do (let* ((forms (types:mal-data-value ast))
+ do (let* ((forms (mal-data-value ast))
(func (env:get-env env (first forms))))
- (setf ast (apply (types:mal-data-value func)
+ (setf ast (apply (mal-data-value func)
(cdr forms)))))
ast)
(loop
do (setf ast (mal-macroexpand ast env))
do (cond
- ((null ast) (return types:mal-nil))
- ((not (types:mal-list-p ast)) (return (eval-ast ast env)))
- ((zerop (length (types:mal-data-value ast))) (return ast))
- (t (let ((forms (types:mal-data-value ast)))
+ ((null ast) (return mal-nil))
+ ((not (mal-list-p ast)) (return (eval-ast ast env)))
+ ((zerop (length (mal-data-value ast))) (return ast))
+ (t (let ((forms (mal-data-value ast)))
(cond
- ((types:mal-data-value= mal-quote (first forms))
+ ((mal-data-value= mal-quote (first forms))
(return (second forms)))
- ((types:mal-data-value= mal-quasiquote (first forms))
+ ((mal-data-value= mal-quasiquote (first forms))
(setf ast (quasiquote (second forms))))
- ((types:mal-data-value= mal-macroexpand (first forms))
+ ((mal-data-value= mal-macroexpand (first forms))
(return (mal-macroexpand (second forms) env)))
- ((types:mal-data-value= mal-def! (first forms))
+ ((mal-data-value= mal-def! (first forms))
(return (env:set-env env (second forms) (mal-eval (third forms) env))))
- ((types:mal-data-value= mal-defmacro! (first forms))
+ ((mal-data-value= mal-defmacro! (first forms))
(let ((value (mal-eval (third forms) env)))
- (return (if (types:mal-fn-p value)
+ (return (if (mal-fn-p value)
(env:set-env env
(second forms)
(progn
- (setf (cdr (assoc 'is-macro (types:mal-data-attrs value))) t)
+ (setf (cdr (assoc 'is-macro (mal-data-attrs value))) t)
value))
(error 'invalid-function
:form value
:context "macro")))))
- ((types:mal-data-value= mal-let* (first forms))
+ ((mal-data-value= mal-let* (first forms))
(let ((new-env (env:create-mal-env :parent env))
- (bindings (utils:listify (types:mal-data-value (second forms)))))
+ (bindings (utils:listify (mal-data-value (second forms)))))
(mapcar (lambda (binding)
(env:set-env new-env
(car binding)
(mal-eval (or (cdr binding)
- types:mal-nil)
+ mal-nil)
new-env)))
(loop
for (symbol value) on bindings
(setf ast (third forms)
env new-env)))
- ((types:mal-data-value= mal-do (first forms))
+ ((mal-data-value= mal-do (first forms))
(mapc (lambda (form) (mal-eval form env))
(butlast (cdr forms)))
(setf ast (car (last forms))))
- ((types:mal-data-value= mal-if (first forms))
+ ((mal-data-value= mal-if (first forms))
(let ((predicate (mal-eval (second forms) env)))
- (setf ast (if (or (types:mal-data-value= predicate types:mal-nil)
- (types:mal-data-value= predicate types:mal-false))
+ (setf ast (if (or (mal-data-value= predicate mal-nil)
+ (mal-data-value= predicate mal-false))
(fourth forms)
(third forms)))))
- ((types:mal-data-value= mal-fn* (first forms))
+ ((mal-data-value= mal-fn* (first forms))
(return (let ((arglist (second forms))
(body (third forms)))
- (types:make-mal-fn (lambda (&rest args)
- (mal-eval body (env:create-mal-env :parent env
- :binds (map 'list
- #'identity
- (types:mal-data-value arglist))
- :exprs args)))
- :attrs (list (cons 'params arglist)
- (cons 'ast body)
- (cons 'env env)
- (cons 'is-macro nil))))))
+ (make-mal-fn (lambda (&rest args)
+ (mal-eval body (env:create-mal-env :parent env
+ :binds (listify (mal-data-value arglist))
+ :exprs args)))
+ :attrs (list (cons 'params arglist)
+ (cons 'ast body)
+ (cons 'env env)
+ (cons 'is-macro nil))))))
(t (let* ((evaluated-list (eval-ast ast env))
(function (car evaluated-list)))
;; If first element is a mal function unwrap it
- (cond ((types:mal-fn-p function)
- (let* ((attrs (types:mal-data-attrs function)))
+ (cond ((mal-fn-p function)
+ (let* ((attrs (mal-data-attrs function)))
(setf ast (cdr (assoc 'ast attrs))
env (env:create-mal-env :parent (cdr (assoc 'env attrs))
:binds (map 'list
#'identity
- (types:mal-data-value (cdr (assoc 'params attrs))))
+ (mal-data-value (cdr (assoc 'params attrs))))
:exprs (cdr evaluated-list)))))
- ((types:mal-builtin-fn-p function)
- (return (apply (types:mal-data-value function)
+ ((mal-builtin-fn-p function)
+ (return (apply (mal-data-value function)
(cdr evaluated-list))))
(t (error 'invalid-function
:form function
(defun rep (string)
(handler-case
- (mal-print (mal-eval (mal-read string)
- *repl-env*))
- (types:mal-error (condition)
- (format nil
- "~a"
- condition))
+ (mal-print (mal-eval (mal-read string) *repl-env*))
+ (mal-error (condition)
+ (format nil "~a" condition))
(error (condition)
- (format nil
- "Internal error: ~a"
- condition))))
+ (format nil "Internal error: ~a" condition))))
(env:set-env *repl-env*
- (types:make-mal-symbol "eval")
- (types:make-mal-builtin-fn (lambda (ast)
- (mal-eval ast *repl-env*))))
+ (make-mal-symbol "eval")
+ (make-mal-builtin-fn (lambda (ast)
+ (mal-eval ast *repl-env*))))
(rep "(def! not (fn* (a) (if a false true)))")
(rep "(def! load-file (fn* (f) (eval (read-string (str \"(do \" (slurp f) \")\")))))")
(defun mal-readline (prompt)
(if *use-readline-p*
- (cl-readline:readline :prompt prompt
+ (rl:readline :prompt prompt
:add-history t
:novelty-check (lambda (old new)
(not (string= old new))))
argv
(cdr (utils:raw-command-line-arguments)))))
(env:set-env *repl-env*
- (types:make-mal-symbol "*ARGV*")
+ (make-mal-symbol "*ARGV*")
(make-mal-list (mapcar #'make-mal-string (cdr args))))
(if (null args)
(repl)
(in-package :mal)
-(define-condition invalid-function (types:mal-runtime-exception)
+(define-condition invalid-function (mal-runtime-exception)
((form :initarg :form :reader form)
(context :initarg :context :reader context))
(:report (lambda (condition stream)
(defvar *repl-env* (env:create-mal-env))
(dolist (binding core:ns)
- (env:set-env *repl-env*
- (car binding)
- (cdr binding)))
+ (env:set-env *repl-env* (car binding) (cdr binding)))
(defvar mal-def! (make-mal-symbol "def!"))
(defvar mal-let* (make-mal-symbol "let*"))
(defun eval-sequence (sequence env)
(map 'list
(lambda (ast) (mal-eval ast env))
- (types:mal-data-value sequence)))
+ (mal-data-value sequence)))
(defun eval-hash-map (hash-map env)
- (let ((hash-map-value (types:mal-data-value hash-map))
- (new-hash-table (types:make-mal-value-hash-table)))
+ (let ((hash-map-value (mal-data-value hash-map))
+ (new-hash-table (make-mal-value-hash-table)))
(genhash:hashmap (lambda (key value)
(setf (genhash:hashref (mal-eval key env) new-hash-table)
(mal-eval value env)))
hash-map-value)
- (types:make-mal-hash-map new-hash-table)))
+ (make-mal-hash-map new-hash-table)))
(defun eval-ast (ast env)
(switch-mal-type ast
(defun is-pair (value)
(and (or (mal-list-p value)
(mal-vector-p value))
- (< 0 (length (types:mal-data-value value)))))
+ (< 0 (length (mal-data-value value)))))
(defun quasiquote (ast)
(if (not (is-pair ast))
- (types:make-mal-list (list mal-quote ast))
- (let ((forms (map 'list #'identity (types:mal-data-value ast))))
+ (make-mal-list (list mal-quote ast))
+ (let ((forms (map 'list #'identity (mal-data-value ast))))
(cond
- ((types:mal-data-value= mal-unquote (first forms))
+ ((mal-data-value= mal-unquote (first forms))
(second forms))
((and (is-pair (first forms))
- (types:mal-data-value= mal-splice-unquote
- (first (types:mal-data-value (first forms)))))
- (types:make-mal-list (list mal-concat
- (second (types:mal-data-value (first forms)))
- (quasiquote (make-mal-list (cdr forms))))))
+ (mal-data-value= mal-splice-unquote
+ (first (mal-data-value (first forms)))))
+ (make-mal-list (list mal-concat
+ (second (mal-data-value (first forms)))
+ (quasiquote (make-mal-list (cdr forms))))))
- (t (types:make-mal-list (list mal-cons
- (quasiquote (first forms))
- (quasiquote (make-mal-list (cdr forms))))))))))
+ (t (make-mal-list (list mal-cons
+ (quasiquote (first forms))
+ (quasiquote (make-mal-list (cdr forms))))))))))
(defun is-macro-call (ast env)
- (when (types:mal-list-p ast)
- (let* ((func-symbol (first (types:mal-data-value ast)))
- (func (when (types:mal-symbol-p func-symbol)
+ (when (mal-list-p ast)
+ (let* ((func-symbol (first (mal-data-value ast)))
+ (func (when (mal-symbol-p func-symbol)
(env:find-env env func-symbol))))
(and func
- (types:mal-fn-p func)
- (cdr (assoc 'is-macro (types:mal-data-attrs func)))))))
+ (mal-fn-p func)
+ (cdr (assoc 'is-macro (mal-data-attrs func)))))))
(defun mal-macroexpand (ast env)
(loop
while (is-macro-call ast env)
- do (let* ((forms (types:mal-data-value ast))
+ do (let* ((forms (mal-data-value ast))
(func (env:get-env env (first forms))))
- (setf ast (apply (types:mal-data-value func)
+ (setf ast (apply (mal-data-value func)
(cdr forms)))))
ast)
(loop
do (setf ast (mal-macroexpand ast env))
do (cond
- ((null ast) (return types:mal-nil))
- ((not (types:mal-list-p ast)) (return (eval-ast ast env)))
- ((zerop (length (types:mal-data-value ast))) (return ast))
- (t (let ((forms (types:mal-data-value ast)))
+ ((null ast) (return mal-nil))
+ ((not (mal-list-p ast)) (return (eval-ast ast env)))
+ ((zerop (length (mal-data-value ast))) (return ast))
+ (t (let ((forms (mal-data-value ast)))
(cond
- ((types:mal-data-value= mal-quote (first forms))
+ ((mal-data-value= mal-quote (first forms))
(return (second forms)))
- ((types:mal-data-value= mal-quasiquote (first forms))
+ ((mal-data-value= mal-quasiquote (first forms))
(setf ast (quasiquote (second forms))))
- ((types:mal-data-value= mal-macroexpand (first forms))
+ ((mal-data-value= mal-macroexpand (first forms))
(return (mal-macroexpand (second forms) env)))
- ((types:mal-data-value= mal-def! (first forms))
+ ((mal-data-value= mal-def! (first forms))
(return (env:set-env env (second forms) (mal-eval (third forms) env))))
- ((types:mal-data-value= mal-defmacro! (first forms))
+ ((mal-data-value= mal-defmacro! (first forms))
(let ((value (mal-eval (third forms) env)))
- (return (if (types:mal-fn-p value)
+ (return (if (mal-fn-p value)
(env:set-env env
(second forms)
(progn
- (setf (cdr (assoc 'is-macro (types:mal-data-attrs value))) t)
+ (setf (cdr (assoc 'is-macro (mal-data-attrs value))) t)
value))
(error 'invalid-function
:form value
:context "macro")))))
- ((types:mal-data-value= mal-let* (first forms))
+ ((mal-data-value= mal-let* (first forms))
(let ((new-env (env:create-mal-env :parent env))
- (bindings (utils:listify (types:mal-data-value (second forms)))))
+ (bindings (utils:listify (mal-data-value (second forms)))))
(mapcar (lambda (binding)
(env:set-env new-env
(car binding)
(mal-eval (or (cdr binding)
- types:mal-nil)
+ mal-nil)
new-env)))
(loop
for (symbol value) on bindings
(setf ast (third forms)
env new-env)))
- ((types:mal-data-value= mal-do (first forms))
+ ((mal-data-value= mal-do (first forms))
(mapc (lambda (form) (mal-eval form env))
(butlast (cdr forms)))
(setf ast (car (last forms))))
- ((types:mal-data-value= mal-if (first forms))
+ ((mal-data-value= mal-if (first forms))
(let ((predicate (mal-eval (second forms) env)))
- (setf ast (if (or (types:mal-data-value= predicate types:mal-nil)
- (types:mal-data-value= predicate types:mal-false))
+ (setf ast (if (or (mal-data-value= predicate mal-nil)
+ (mal-data-value= predicate mal-false))
(fourth forms)
(third forms)))))
- ((types:mal-data-value= mal-fn* (first forms))
+ ((mal-data-value= mal-fn* (first forms))
(return (let ((arglist (second forms))
(body (third forms)))
- (types:make-mal-fn (lambda (&rest args)
- (mal-eval body (env:create-mal-env :parent env
- :binds (map 'list
- #'identity
- (types:mal-data-value arglist))
- :exprs args)))
- :attrs (list (cons 'params arglist)
- (cons 'ast body)
- (cons 'env env)
- (cons 'is-macro nil))))))
-
- ((types:mal-data-value= mal-try* (first forms))
+ (make-mal-fn (lambda (&rest args)
+ (mal-eval body (env:create-mal-env :parent env
+ :binds (listify (mal-data-value arglist))
+ :exprs args)))
+ :attrs (list (cons 'params arglist)
+ (cons 'ast body)
+ (cons 'env env)
+ (cons 'is-macro nil))))))
+
+ ((mal-data-value= mal-try* (first forms))
(handler-case
(return (mal-eval (second forms) env))
- ((or types:mal-exception types:mal-error) (condition)
+ ((or mal-exception mal-error) (condition)
(when (third forms)
- (let ((catch-forms (types:mal-data-value (third forms))))
- (when (types:mal-data-value= mal-catch*
- (first catch-forms))
+ (let ((catch-forms (mal-data-value (third forms))))
+ (when (mal-data-value= mal-catch*
+ (first catch-forms))
(return (mal-eval (third catch-forms)
(env:create-mal-env :parent env
:binds (list (second catch-forms))
- :exprs (list (if (or (typep condition 'types:mal-runtime-exception)
- (typep condition 'types:mal-error))
- (types:make-mal-string (format nil "~a" condition))
- (types::mal-exception-data condition)))))))))
+ :exprs (list (if (or (typep condition 'mal-runtime-exception)
+ (typep condition 'mal-error))
+ (make-mal-string (format nil "~a" condition))
+ (mal-exception-data condition)))))))))
(error condition))))
(t (let* ((evaluated-list (eval-ast ast env))
(function (car evaluated-list)))
;; If first element is a mal function unwrap it
- (cond ((types:mal-fn-p function)
- (let* ((attrs (types:mal-data-attrs function)))
+ (cond ((mal-fn-p function)
+ (let* ((attrs (mal-data-attrs function)))
(setf ast (cdr (assoc 'ast attrs))
env (env:create-mal-env :parent (cdr (assoc 'env attrs))
:binds (map 'list
#'identity
- (types:mal-data-value (cdr (assoc 'params attrs))))
+ (mal-data-value (cdr (assoc 'params attrs))))
:exprs (cdr evaluated-list)))))
- ((types:mal-builtin-fn-p function)
- (return (apply (types:mal-data-value function)
+ ((mal-builtin-fn-p function)
+ (return (apply (mal-data-value function)
(cdr evaluated-list))))
(t (error 'invalid-function
:form function
(defun rep (string)
(handler-case
- (mal-print (mal-eval (mal-read string)
- *repl-env*))
- (types:mal-error (condition)
- (format nil
- "Error: ~a"
- condition))
- (types:mal-runtime-exception (condition)
- (format nil
- "Exception: ~a"
- condition))
- (types:mal-user-exception (condition)
- (format nil
- "Exception: ~a"
- (pr-str (types::mal-exception-data condition))))
+ (mal-print (mal-eval (mal-read string) *repl-env*))
+ (mal-error (condition)
+ (format nil "Error: ~a" condition))
+ (mal-runtime-exception (condition)
+ (format nil "Exception: ~a" condition))
+ (mal-user-exception (condition)
+ (format nil "Exception: ~a" (pr-str (mal-exception-data condition))))
(error (condition)
- (format nil
- "Internal error: ~a"
- condition))))
+ (format nil "Internal error: ~a" condition))))
(env:set-env *repl-env*
- (types:make-mal-symbol "eval")
- (types:make-mal-builtin-fn (lambda (ast)
- (mal-eval ast *repl-env*))))
+ (make-mal-symbol "eval")
+ (make-mal-builtin-fn (lambda (ast)
+ (mal-eval ast *repl-env*))))
(rep "(def! not (fn* (a) (if a false true)))")
(rep "(def! load-file (fn* (f) (eval (read-string (str \"(do \" (slurp f) \")\")))))")
(defun mal-readline (prompt)
(if *use-readline-p*
- (cl-readline:readline :prompt prompt
+ (rl:readline :prompt prompt
:add-history t
:novelty-check (lambda (old new)
(not (string= old new))))
argv
(cdr (utils:raw-command-line-arguments)))))
(env:set-env *repl-env*
- (types:make-mal-symbol "*ARGV*")
+ (make-mal-symbol "*ARGV*")
(make-mal-list (mapcar #'make-mal-string (cdr args))))
(if (null args)
(repl)
(in-package :mal)
-(define-condition invalid-function (types:mal-runtime-exception)
+(define-condition invalid-function (mal-runtime-exception)
((form :initarg :form :reader form)
(context :initarg :context :reader context))
(:report (lambda (condition stream)
"applying"
"defining macro")))))
-
(defvar *repl-env* (env:create-mal-env))
(dolist (binding core:ns)
- (env:set-env *repl-env*
- (car binding)
- (cdr binding)))
+ (env:set-env *repl-env* (car binding) (cdr binding)))
(defvar mal-def! (make-mal-symbol "def!"))
(defvar mal-let* (make-mal-symbol "let*"))
(defun eval-sequence (sequence env)
(map 'list
(lambda (ast) (mal-eval ast env))
- (types:mal-data-value sequence)))
+ (mal-data-value sequence)))
(defun eval-hash-map (hash-map env)
- (let ((hash-map-value (types:mal-data-value hash-map))
- (new-hash-table (types:make-mal-value-hash-table)))
+ (let ((hash-map-value (mal-data-value hash-map))
+ (new-hash-table (make-mal-value-hash-table)))
(genhash:hashmap (lambda (key value)
(setf (genhash:hashref (mal-eval key env) new-hash-table)
(mal-eval value env)))
hash-map-value)
- (types:make-mal-hash-map new-hash-table)))
+ (make-mal-hash-map new-hash-table)))
(defun eval-ast (ast env)
(switch-mal-type ast
(defun is-pair (value)
(and (or (mal-list-p value)
(mal-vector-p value))
- (< 0 (length (types:mal-data-value value)))))
+ (< 0 (length (mal-data-value value)))))
(defun quasiquote (ast)
(if (not (is-pair ast))
- (types:make-mal-list (list mal-quote ast))
- (let ((forms (map 'list #'identity (types:mal-data-value ast))))
+ (make-mal-list (list mal-quote ast))
+ (let ((forms (map 'list #'identity (mal-data-value ast))))
(cond
- ((types:mal-data-value= mal-unquote (first forms))
+ ((mal-data-value= mal-unquote (first forms))
(second forms))
((and (is-pair (first forms))
- (types:mal-data-value= mal-splice-unquote
- (first (types:mal-data-value (first forms)))))
- (types:make-mal-list (list mal-concat
- (second (types:mal-data-value (first forms)))
- (quasiquote (make-mal-list (cdr forms))))))
+ (mal-data-value= mal-splice-unquote
+ (first (mal-data-value (first forms)))))
+ (make-mal-list (list mal-concat
+ (second (mal-data-value (first forms)))
+ (quasiquote (make-mal-list (cdr forms))))))
- (t (types:make-mal-list (list mal-cons
- (quasiquote (first forms))
- (quasiquote (make-mal-list (cdr forms))))))))))
+ (t (make-mal-list (list mal-cons
+ (quasiquote (first forms))
+ (quasiquote (make-mal-list (cdr forms))))))))))
(defun is-macro-call (ast env)
- (when (types:mal-list-p ast)
- (let* ((func-symbol (first (types:mal-data-value ast)))
- (func (when (types:mal-symbol-p func-symbol)
+ (when (mal-list-p ast)
+ (let* ((func-symbol (first (mal-data-value ast)))
+ (func (when (mal-symbol-p func-symbol)
(env:find-env env func-symbol))))
(and func
- (types:mal-fn-p func)
- (cdr (assoc 'is-macro (types:mal-data-attrs func)))))))
+ (mal-fn-p func)
+ (cdr (assoc 'is-macro (mal-data-attrs func)))))))
(defun mal-macroexpand (ast env)
(loop
while (is-macro-call ast env)
- do (let* ((forms (types:mal-data-value ast))
+ do (let* ((forms (mal-data-value ast))
(func (env:get-env env (first forms))))
- (setf ast (apply (types:mal-data-value func)
+ (setf ast (apply (mal-data-value func)
(cdr forms)))))
ast)
(loop
do (setf ast (mal-macroexpand ast env))
do (cond
- ((null ast) (return types:mal-nil))
- ((not (types:mal-list-p ast)) (return (eval-ast ast env)))
- ((zerop (length (types:mal-data-value ast))) (return ast))
- (t (let ((forms (types:mal-data-value ast)))
+ ((null ast) (return mal-nil))
+ ((not (mal-list-p ast)) (return (eval-ast ast env)))
+ ((zerop (length (mal-data-value ast))) (return ast))
+ (t (let ((forms (mal-data-value ast)))
(cond
- ((types:mal-data-value= mal-quote (first forms))
+ ((mal-data-value= mal-quote (first forms))
(return (second forms)))
- ((types:mal-data-value= mal-quasiquote (first forms))
+ ((mal-data-value= mal-quasiquote (first forms))
(setf ast (quasiquote (second forms))))
- ((types:mal-data-value= mal-macroexpand (first forms))
+ ((mal-data-value= mal-macroexpand (first forms))
(return (mal-macroexpand (second forms) env)))
- ((types:mal-data-value= mal-def! (first forms))
+ ((mal-data-value= mal-def! (first forms))
(return (env:set-env env (second forms) (mal-eval (third forms) env))))
- ((types:mal-data-value= mal-defmacro! (first forms))
+ ((mal-data-value= mal-defmacro! (first forms))
(let ((value (mal-eval (third forms) env)))
- (return (if (types:mal-fn-p value)
+ (return (if (mal-fn-p value)
(env:set-env env
(second forms)
(progn
- (setf (cdr (assoc 'is-macro (types:mal-data-attrs value))) t)
+ (setf (cdr (assoc 'is-macro (mal-data-attrs value))) t)
value))
(error 'invalid-function
:form value
:context "macro")))))
- ((types:mal-data-value= mal-let* (first forms))
+ ((mal-data-value= mal-let* (first forms))
(let ((new-env (env:create-mal-env :parent env))
- (bindings (utils:listify (types:mal-data-value (second forms)))))
+ (bindings (utils:listify (mal-data-value (second forms)))))
(mapcar (lambda (binding)
(env:set-env new-env
(car binding)
(mal-eval (or (cdr binding)
- types:mal-nil)
+ mal-nil)
new-env)))
(loop
for (symbol value) on bindings
(setf ast (third forms)
env new-env)))
- ((types:mal-data-value= mal-do (first forms))
+ ((mal-data-value= mal-do (first forms))
(mapc (lambda (form) (mal-eval form env))
(butlast (cdr forms)))
(setf ast (car (last forms))))
- ((types:mal-data-value= mal-if (first forms))
+ ((mal-data-value= mal-if (first forms))
(let ((predicate (mal-eval (second forms) env)))
- (setf ast (if (or (types:mal-data-value= predicate types:mal-nil)
- (types:mal-data-value= predicate types:mal-false))
+ (setf ast (if (or (mal-data-value= predicate mal-nil)
+ (mal-data-value= predicate mal-false))
(fourth forms)
(third forms)))))
- ((types:mal-data-value= mal-fn* (first forms))
+ ((mal-data-value= mal-fn* (first forms))
(return (let ((arglist (second forms))
(body (third forms)))
- (types:make-mal-fn (lambda (&rest args)
- (mal-eval body (env:create-mal-env :parent env
- :binds (map 'list
- #'identity
- (types:mal-data-value arglist))
- :exprs args)))
- :attrs (list (cons 'params arglist)
- (cons 'ast body)
- (cons 'env env)
- (cons 'is-macro nil))))))
-
- ((types:mal-data-value= mal-try* (first forms))
+ (make-mal-fn (lambda (&rest args)
+ (mal-eval body (env:create-mal-env :parent env
+ :binds (listify (mal-data-value arglist))
+ :exprs args)))
+ :attrs (list (cons 'params arglist)
+ (cons 'ast body)
+ (cons 'env env)
+ (cons 'is-macro nil))))))
+
+ ((mal-data-value= mal-try* (first forms))
(handler-case
(return (mal-eval (second forms) env))
- ((or types:mal-exception types:mal-error) (condition)
+ ((or mal-exception mal-error) (condition)
(when (third forms)
- (let ((catch-forms (types:mal-data-value (third forms))))
- (when (types:mal-data-value= mal-catch*
- (first catch-forms))
+ (let ((catch-forms (mal-data-value (third forms))))
+ (when (mal-data-value= mal-catch*
+ (first catch-forms))
(return (mal-eval (third catch-forms)
(env:create-mal-env :parent env
:binds (list (second catch-forms))
- :exprs (list (if (or (typep condition 'types:mal-runtime-exception)
- (typep condition 'types:mal-error))
- (types:make-mal-string (format nil "~a" condition))
- (types::mal-exception-data condition)))))))))
+ :exprs (list (if (or (typep condition 'mal-runtime-exception)
+ (typep condition 'mal-error))
+ (make-mal-string (format nil "~a" condition))
+ (mal-exception-data condition)))))))))
(error condition))))
(t (let* ((evaluated-list (eval-ast ast env))
(function (car evaluated-list)))
;; If first element is a mal function unwrap it
- (cond ((types:mal-fn-p function)
- (let* ((attrs (types:mal-data-attrs function)))
+ (cond ((mal-fn-p function)
+ (let* ((attrs (mal-data-attrs function)))
(setf ast (cdr (assoc 'ast attrs))
env (env:create-mal-env :parent (cdr (assoc 'env attrs))
:binds (map 'list
#'identity
- (types:mal-data-value (cdr (assoc 'params attrs))))
+ (mal-data-value (cdr (assoc 'params attrs))))
:exprs (cdr evaluated-list)))))
- ((types:mal-builtin-fn-p function)
- (return (apply (types:mal-data-value function)
+ ((mal-builtin-fn-p function)
+ (return (apply (mal-data-value function)
(cdr evaluated-list))))
(t (error 'invalid-function
:form function
(defun rep (string)
(handler-case
- (mal-print (mal-eval (mal-read string)
- *repl-env*))
- (types:mal-error (condition)
- (format nil
- "Error: ~a"
- condition))
- (types:mal-runtime-exception (condition)
- (format nil
- "Exception: ~a"
- condition))
- (types:mal-user-exception (condition)
- (format nil
- "Exception: ~a"
- (pr-str (types::mal-exception-data condition))))
+ (mal-print (mal-eval (mal-read string) *repl-env*))
+ (mal-error (condition)
+ (format nil "Error: ~a" condition))
+ (mal-runtime-exception (condition)
+ (format nil "Exception: ~a" condition))
+ (mal-user-exception (condition)
+ (format nil "Exception: ~a" (pr-str (mal-exception-data condition))))
(error (condition)
- (format nil
- "Internal error: ~a"
- condition))))
+ (format nil "Internal error: ~a" condition))))
(env:set-env *repl-env*
- (types:make-mal-symbol "eval")
- (types:make-mal-builtin-fn (lambda (ast)
- (mal-eval ast *repl-env*))))
+ (make-mal-symbol "eval")
+ (make-mal-builtin-fn (lambda (ast)
+ (mal-eval ast *repl-env*))))
(env:set-env *repl-env*
- (types:make-mal-symbol "*cl-implementation*")
+ (make-mal-symbol "*cl-implementation*")
(make-mal-string (lisp-implementation-type)))
(env:set-env *repl-env*
- (types:make-mal-symbol "*cl-version*")
+ (make-mal-symbol "*cl-version*")
(make-mal-string (lisp-implementation-version)))
(rep "(def! not (fn* (a) (if a false true)))")
(defun mal-readline (prompt)
(if *use-readline-p*
- (cl-readline:readline :prompt prompt
+ (rl:readline :prompt prompt
:add-history t
:novelty-check (lambda (old new)
(not (string= old new))))
argv
(cdr (utils:raw-command-line-arguments)))))
(env:set-env *repl-env*
- (types:make-mal-symbol "*ARGV*")
+ (make-mal-symbol "*ARGV*")
(make-mal-list (mapcar #'make-mal-string (cdr args))))
(if (null args)
(repl)
:make-mal-value-hash-table
;; Error types
:mal-exception
+ :mal-exception-data
;; Exceptions raised by the runtime
:mal-runtime-exception
;; Exception raised by user code
(in-package :types)
-(define-condition mal-error (error)
- nil)
+(define-condition mal-error (error) nil)
-(define-condition mal-exception (error)
- nil)
+(define-condition mal-exception (error) nil)
-(define-condition mal-runtime-exception (mal-exception)
- nil)
+(define-condition mal-runtime-exception (mal-exception) nil)
(define-condition mal-user-exception (mal-exception)
((data :accessor mal-exception-data :initarg :data)))
`(let ((type (mal-data-type ,ast)))
(cond
,@(mapcar (lambda (form)
- (list (if (or (equal (car form) t)
- (equal (car form) 'any))
- t
+ (list (or (equal (car form) t)
+ (equal (car form) 'any)
(list 'equal (list 'quote (car form)) 'type))
(cadr form)))
forms))))
(defun mal-sequence= (value1 value2)
- (let ((sequence1 (utils:listify (mal-data-value value1)))
- (sequence2 (utils:listify (mal-data-value value2))))
+ (let ((sequence1 (listify (mal-data-value value1)))
+ (sequence2 (listify (mal-data-value value2))))
+
(when (= (length sequence1) (length sequence2))
- (every #'identity
- (loop
- for x in sequence1
- for y in sequence2
- collect (mal-data-value= x y))))))
+ (every #'identity (loop for x in sequence1
+ for y in sequence2
+ collect (mal-data-value= x y))))))
(defun mal-hash-map= (value1 value2)
(let ((map1 (mal-data-value value1))
(map2 (mal-data-value value2))
(identical t))
- (when (= (genhash:generic-hash-table-count map1)
- (genhash:generic-hash-table-count map2))
- (genhash:hashmap (lambda (key value)
- (declare (ignorable value))
- (setf identical
- (and identical (mal-data-value= (genhash:hashref key map1)
- (genhash:hashref key map2)))))
- map1)
+ (when (= (generic-hash-table-count map1)
+ (generic-hash-table-count map2))
+ (hashmap (lambda (key value)
+ (declare (ignorable value))
+ (setf identical
+ (and identical (mal-data-value= (hashref key map1)
+ (hashref key map2)))))
+ map1)
identical)))
(defun mal-data-value= (value1 value2)
;; instead
(let ((hash-function #+(or ecl abcl) #'mal-sxhash
#-(or ecl abcl) #'sxhash))
- (genhash:register-test-designator 'mal-data-value-hash
- hash-function
- #'mal-data-value=)))
- (genhash:make-generic-hash-table :test 'mal-data-value-hash))
+ (register-test-designator 'mal-data-value-hash
+ hash-function
+ #'mal-data-value=)))
+ (make-generic-hash-table :test 'mal-data-value-hash))