Yes. There are many challenging aspects. It's best to think of it as writing a Choose-Your-Own-Adventure book.
You make up the speech, the responses, the mechanics that govern which step goes next, etc.. It's true there's a lot more you can do with it, but that is probably the most accessible way to look at it.
Check also the Programming Talk forum
for threads on SWC-LISP and others who are learning to use it.
Can it be coded so it provides a different options if the player has already interacted with it?
e.g.: (defvar has-talked? (ovar 'has-talked? #f)) ; make a persistent variable that is unique to the NPC and Character interacting with it (ovar) named has-talked? and have it evaluate to #f by default (ie unless set-var! otherwise)
(cond [has-talked? (welcome-back)]
(say "Hello. I am Jorge. Now that I've introduced myself, I shouldn't do that again, so I'm going to set has-talked? to #t (meaning 'True") so this character doesn't see this again. ") (set-var! has-talked? #t))
(say "Hello again!"))
I doubt there's any chance it can provide a reward or do a more complex function than that unofficially.
As with almost all other games, the reward itself isn't the interesting part. The interaction leading up to the reward is the key. Make an interaction interesting for its own sake, and let the rewards follow from PCs. Keep in mind also that there are any number of "imaginary" or manufactured rewards that Players create. Think of all the custom items that exist - collector cards, drink bottles, 'artefacts', etc.. You can use an entirely imaginary asset that is tracked solely through scripts.
Can dialogue options disappear based on something? So it's not repetitive.
e.g. (defun (is-human? targ) (cond [(eq? (get-race targ) "Human") #t][#t #f]))
(defun start (cond [(is-human? character) (say "Hello, Human!")][#t (say "You're not Human!")]))
See also the Guide for another explicit example on that front.