Not a specific answer to your question, but it would be cool to see someone make the core.match regex facilities handle this.
(match [msg] [(#"^:(.*?)!.*PRIVMSG (.*) :(.*)" :>> [from to message])] ... true form ... :else ... false form ..) David On Fri, Jun 21, 2013 at 11:43 AM, Steven D. Arnold < thoth.amon.i...@gmail.com> wrote: > Hi, I am writing a simple IRC bot, pretty much just for fun, starting with > a simple implementation originally posted by Nurullah Akkaya on his blog. > It already does what it's supposed to, which is message a fortune from > mod-fortune (shelling out) when someone asks it to. > > However, there's a bit of code I don't like. It looks like this: > > (cond > (re-find #"^:(.*?)!.*PRIVMSG (.*) :(.*)" msg) > (let [[_ from to message] (re-find #"^:(.*?)!.*PRIVMSG (.*) > :(.*)" msg)] > [...logic omitted...] > > What's happening is we're looking for a PRIVMSG, and if we find one, we > scan the message again and pull out the chunks we're interested in, and use > them in the "logic" part below. > > The problem is I don't like maintaining two regular expressions. I wish I > could use it only once, and therefore change it only once if it needs to be > modified. I'd prefer to see an expression that looks like this (for > example): > > (cond > (if-matched #"^:(.*?)!.*PRIVMSG (.*) :(.*)" msg > [from to message] > (true form) > (optional false form))) > > The if-matched acts as a let block while pulling out groups and assigning > to local variables at the same time. Also, it ignores the first "match" of > re-find, which is the entire expression -- not generally useful to me. > Maybe if-matched-groups would ignore the overall expression, and > if-matched would include it. > > I suppose a macro might be the way to go to accomplish this, but I wonder > if there are any Clojure tricks that could accomplish this short of a > macro. Also, do any fellow Clojurians think a macro like this is a bad > idea in general? Would you suggest taking a different tack to solve this > problem? > > Thanks in advance! > steven > > -- > -- > You received this message because you are subscribed to the Google > Groups "Clojure" group. > To post to this group, send email to clojure@googlegroups.com > Note that posts from new members are moderated - please be patient with > your first post. > To unsubscribe from this group, send email to > clojure+unsubscr...@googlegroups.com > For more options, visit this group at > http://groups.google.com/group/clojure?hl=en > --- > You received this message because you are subscribed to the Google Groups > "Clojure" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to clojure+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/groups/opt_out. > > > -- -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/groups/opt_out.