(set! list (lambda l l))

(set! symbolp (lambda (x) (equal (type x) "SYMB")))

(set! defun!
      (nlambda
       form
       (cond ((symbolp (car form))
              (set (car form) (apply 'lambda (cdr form))))
         (t nil))))

(set! defun!
      (nlambda
       form
       (eval (list 'set! (car form) (cons 'lambda (cdr form))))))

(defun! square (x) (* x x))

(set! defsp!
      (nlambda
       form
       (cond (symbolp (car form))
         (set! (car form) (apply nlambda (cdr form))))))

(defsp! cube (x) ((* x x x)))

(set! p 5)

(square 5) ;; should work

(square p) ;; should work

(cube 5) ;; should work

(cube p) ;; should fail: unbound symbol