diff --git a/bootstrap/15.1-conses b/bootstrap/15.1-conses new file mode 100644 index 0000000..3dac52b --- /dev/null +++ b/bootstrap/15.1-conses @@ -0,0 +1,55 @@ +;; PRIMITIVE : car +;; PRIMITIVE : cdr +;; PRIMITIVE : cons +;; NEED : eql +;; NEED : complement + +(defun caaaar (list) (car (car (car (car list))))) +(defun caaadr (list) (car (car (car (cdr list))))) +(defun caadar (list) (car (car (cdr (car list))))) +(defun caaddr (list) (car (car (cdr (cdr list))))) +(defun cadaar (list) (car (cdr (car (car list))))) +(defun cadadr (list) (car (cdr (car (cdr list))))) +(defun caddar (list) (car (cdr (cdr (car list))))) +(defun cadddr (list) (car (cdr (cdr (cdr list))))) +(defun cdaaar (list) (cdr (car (car (car list))))) +(defun cdaadr (list) (cdr (car (car (cdr list))))) +(defun cdadar (list) (cdr (car (cdr (car list))))) +(defun cdaddr (list) (cdr (car (cdr (cdr list))))) +(defun cddaar (list) (cdr (cdr (car (car list))))) +(defun cddadr (list) (cdr (cdr (car (cdr list))))) +(defun cdddar (list) (cdr (cdr (cdr (car list))))) +(defun cddddr (list) (cdr (cdr (cdr (cdr list))))) +(defun caaar (list) (car (car (car list))))) +(defun caadr (list) (car (car (cdr list))))) +(defun cadar (list) (car (cdr (car list))))) +(defun caddr (list) (car (cdr (cdr list))))) +(defun cdaar (list) (cdr (car (car list))))) +(defun cdadr (list) (cdr (car (cdr list))))) +(defun cddar (list) (cdr (cdr (car list))))) +(defun cdddr (list) (cdr (cdr (cdr list))))) +(defun caar (list) (car (car list))))) +(defun cadr (list) (car (cdr list))))) +(defun cdar (list) (cdr (car list))))) +(defun cddr (list) (cdr (cdr list))))) + +;; Comptez les "d" :) +(defun first (list) (car list)) +(defun second (list) (cadr list)) +(defun third (list) (caddr list)) +(defun fourth (list) (cadddr list)) +(defun fifth (list) (car (cddddr list))) +(defun sixth (list) (cadr (cddddr list))) +(defun seventh (list) (caddr (cddddr list))) +(defun eighth (list) (cadddr (cddddr list))) +(defun ninth (list) (car (cddddr (cddddr list)))) +(defun tenth (list) (cadr (cddddr (cddddr list)))) + +(defun tree-equal (x y &key (:test #'eql) :test-not) + (when test-not (setq test (complement test-not))) + (if (or (consp x) (consp y)) + (and (consp x) + (consp y) + (tree-equal (car x) (car y) :test test) + (tree-equal (cdr x) (cdr y) :test test)) + (funcall test x y))) diff --git a/implementation/loop.lisp b/bootstrap/26-loop.lisp similarity index 100% rename from implementation/loop.lisp rename to bootstrap/26-loop.lisp diff --git a/bootstrap/core-mcompile.lisp b/bootstrap/core-mcompile.lisp new file mode 100644 index 0000000..e69de29 diff --git a/bootstrap/core-meval.lisp b/bootstrap/core-meval.lisp new file mode 100644 index 0000000..82bd22e --- /dev/null +++ b/bootstrap/core-meval.lisp @@ -0,0 +1,2 @@ +(defvar fonctions-globales-importees + '(car cdr cons)) ;; 15.1-conses diff --git a/implementation/divers.lisp b/implementation/divers.lisp index 2a7d02a..be24337 100644 --- a/implementation/divers.lisp +++ b/implementation/divers.lisp @@ -58,48 +58,6 @@ (defmacro cdr (list) (%asm )) ;; TODO : list dans rX, résultat dans rY => move rX, rY; incr rY; move [indirect rY], rY; -;; Les alias c*r ont été générés par un script (plus facile que de les méta-programmer...). -(defmacro caaaar (list) `(car (car (car (car ,list))))) -(defmacro caaadr (list) `(car (car (car (cdr ,list))))) -(defmacro caadar (list) `(car (car (cdr (car ,list))))) -(defmacro caaddr (list) `(car (car (cdr (cdr ,list))))) -(defmacro cadaar (list) `(car (cdr (car (car ,list))))) -(defmacro cadadr (list) `(car (cdr (car (cdr ,list))))) -(defmacro caddar (list) `(car (cdr (cdr (car ,list))))) -(defmacro cadddr (list) `(car (cdr (cdr (cdr ,list))))) -(defmacro cdaaar (list) `(cdr (car (car (car ,list))))) -(defmacro cdaadr (list) `(cdr (car (car (cdr ,list))))) -(defmacro cdadar (list) `(cdr (car (cdr (car ,list))))) -(defmacro cdaddr (list) `(cdr (car (cdr (cdr ,list))))) -(defmacro cddaar (list) `(cdr (cdr (car (car ,list))))) -(defmacro cddadr (list) `(cdr (cdr (car (cdr ,list))))) -(defmacro cdddar (list) `(cdr (cdr (cdr (car ,list))))) -(defmacro cddddr (list) `(cdr (cdr (cdr (cdr ,list))))) -(defmacro caaar (list) `(car (car (car ,list))))) -(defmacro caadr (list) `(car (car (cdr ,list))))) -(defmacro cadar (list) `(car (cdr (car ,list))))) -(defmacro caddr (list) `(car (cdr (cdr ,list))))) -(defmacro cdaar (list) `(cdr (car (car ,list))))) -(defmacro cdadr (list) `(cdr (car (cdr ,list))))) -(defmacro cddar (list) `(cdr (cdr (car ,list))))) -(defmacro cdddr (list) `(cdr (cdr (cdr ,list))))) -(defmacro caar (list) `(car (car ,list))))) -(defmacro cadr (list) `(car (cdr ,list))))) -(defmacro cdar (list) `(cdr (car ,list))))) -(defmacro cddr (list) `(cdr (cdr ,list))))) - -;; Comptez les "d" :) -(defmacro first (list) `(car ,list)) -(defmacro second (list) `(cadr ,list)) -(defmacro third (list) `(caddr ,list)) -(defmacro fourth (list) `(cadddr ,list)) -(defmacro fifth (list) `(car (cddddr ,list))) -(defmacro sixth (list) `(cadr (cddddr ,list))) -(defmacro seventh (list) `(caddr (cddddr ,list))) -(defmacro eighth (list) `(cadddr (cddddr ,list))) -(defmacro ninth (list) `(car (cddddr (cddddr ,list)))) -(defmacro tenth (list) `(cadr (cddddr (cddddr ,list)))) - (defmacro let (bindings &rest body) `((lambda ,(mapcar #'car bindings) ,@body)