;; Because I don't (yet) have syntax for varargs, the body must be passed
;; to defun as a list of sexprs.
(set! defun!
      (nlambda
       (name args body)
       (cond (symbolp name)
         (set! name (apply lambda (cons args body))))))

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

(set! defsp!
      (nlambda
       (name args body)
       (cond (symbolp name)
         (set! name (nlambda args body)))))

(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