(shadow 'defun)
(shadow 'let)
(shadow 'flet)
(shadow 'labels)

(cl:defun make-funcall-macros (bindings)
  (mapcar
    #'(lambda (x)
        (cl:let
          ((name (if (listp x)
                   (car x)
                   x)))
          `(,name (&rest args)
                  `(funcall ,',name ,@args))))
    bindings))

(defmacro defun (name args &body body)
  `(progn
     (cl:defun
       ,name ,args
       (macrolet
         ,(make-funcall-macros args)
         ,@body))
     (defparameter ,name #',name)))

(defmacro let (bindings &body body)
  `(cl:let ,bindings
     (macrolet
       ,(make-funcall-macros bindings)
       ,@body)))

(defmacro flet (bindings &body body)
  `(let ,bindings ,@body))

(defmacro labels (bindings &body body)
  `(let ,(mapcar #'car bindings)
     (macrolet
       ,(make-funcall-macros bindings)
       ,@(mapcar
           #'(lambda (x)
               `(setq ,(car x)
                      #'(lambda ,@(cdr x))))
           bindings)
       ,@body)))

(defun add (a b)
  (+ a b))

(print (mapcar add '(1 2 3) '(4 5 6)))

(let ((test #'(lambda (x) (print x))))
  (test 1))