LISP系ならあれこれ言う前にマクロで作ってみればいいんじゃないかと。
(define-macro (define-optional (name . arg)...)
`(define ,name (lambda ,(filter-not-optional arg)
 (let ,name ,(filter-optional arg),...)))
みたいにして、
(define-optional (pow x n (&optional res 1))
 (if(zero? n)res(pow x(1- n)(* res x))))