I am trying to make it so that “talk to $ about $” is understood and is the redirect target of “ask $ about $” and “tell $ about $”. Here is what I have:
(understand [talk to | $words] as [talk to $person about $topic])
*(split $words by [about] into $left and $right)
*(understand $left as single object $person preferably animate)
*(understand $right as topic $topic)
(perform [ask $person about $topic])
(try [talk to $person about $topic])
(perform [tell $person about $topic])
(try [talk to $person about $topic])
This does not work, I get for “talk to person about topic”: “(I only understood you as far as wanting to talk to someone.)” I will note that “talk to person” works fine. Any idea what I am doing wrong? (For that matter I think “talk to $ about $” should probably be in the standard library as the standard redirect for “ask $ about $” and “tell $ about $”, redirecting to “talk to $”.)
This was a tricky one. Turns out there is a rewrite rule at work. From the standard library:
(rewrite [talk to | $Words] into [talk | $Words])
and then
(understand [talk/speak | $Words] as [talk to $Obj])
*(understand $Words as single object $Obj preferably animate)
So you could modify your rule to:
(understand [talk | $Words] as [talk to $Obj about $Topic])
*(split $Words by [about] into $Left and $Right)
*(understand $Left as single object $Obj preferably animate)
*(understand $Right as topic $Topic)
I will reconsider this approach in the library, because it is clearly confusing. Perhaps rewriting should be reserved for the story author.
I’ll also think about adding “talk to / about” as a default verb. Thanks for the suggestion!
By the way, you are also going to need this:
(refuse [talk to $Obj about $])
(just) (when $Obj is not here)
because the default is to refuse any action involving an object that’s out of reach.