It's more of a case of what's the right tool for the job. Visual LISP, or active functions serve a specialized and vital role -- I use them by the truck load, but to use them just for the sake of using it? I'll pass. In the context you provided there is no benefit (to me) to use the utility object. I understand if you want to learn it, but in production it serves no additional leverage or advantage that I can see, though I welcome enlightenment.
Anyway, here's a vanilla skeleton to start you off --
(defun c:Test ( / message response )
(setq message "Layer/Style/<enter base point>: ")
(initget 128 "Layer Style")
(cond
( (null
(setq response
(getpoint message)
)
)
;; is null logic
)
( (eq "Layer" response)
;; is layer logic
)
( (eq "Style" response)
;; is style logic
)
( (and
(listp response)
(eq 3 (length response))
(vl-every 'numberp response)
)
;; is point logic
)
( t
;; da'hell? logic
)
)
(princ)
)
Hope it helps.