execute top level require forms
[bpt/guile.git] / module / language / elisp / boot.el
index fae86a2..e6d3994 100644 (file)
     (%funcall (@ (language elisp runtime) eval-elisp) form)))
 
 (eval-and-compile
-  (defun null (object)
+  (defsubst null (object)
+    (declare (lexical object))
     (if object nil t))
-  (defun consp (object)
-    (%funcall (@ (guile) pair?) object))
+  (defsubst consp (x)
+    (declare (lexical x))
+    (%funcall (@ (guile) pair?) x))
+  (defsubst atom (x)
+    (declare (lexical x))
+    (null (consp x)))
   (defun listp (object)
+    (declare (lexical object))
     (if object (consp object) t))
-  (defun car (list)
+  (defsubst car (list)
+    (declare (lexical list))
     (if list (%funcall (@ (guile) car) list) nil))
-  (defun cdr (list)
+  (defsubst cdr (list)
+    (declare (lexical list))
     (if list (%funcall (@ (guile) cdr) list) nil))
   (defun make-symbol (name)
     (%funcall (@ (guile) make-symbol) name))
                 (function (lambda (&rest args)
                             (apply (autoload-do-load definition symbol nil) args)))
                 definition)))
+            ((and (symbolp definition)
+                  (let ((fn (symbol-function definition)))
+                    (and (consp fn)
+                         (or (eq (car fn) 'macro)
+                             (and (eq (car fn) 'autoload)
+                                  (or (eq (nth 4 fn) 'macro)
+                                      (eq (nth 4 fn) t)))))))
+             (cons 'macro
+                   (funcall
+                    (@ (language elisp falias) make-falias)
+                    (function (lambda (&rest args) `(,definition ,@args)))
+                    definition)))
             (t
              (funcall (@ (language elisp falias) make-falias)
                       (function (lambda (&rest args) (apply definition args)))
 
 (defun %set-eager-macroexpansion-mode (ignore)
   nil)
+
+(%define-compiler-macro require (form)
+  `(eval-when (:compile-toplevel :load-toplevel :execute)
+     (funcall #'require ,@(cdr form))))