&引用;“未绑定”;clojure函数中的变量
我正在编写一个函数,将IRC RFC2813消息解析为它们的组成部分。它由两个函数组成,一个用于通过正则表达式拆分消息,另一个用于修改返回以处理某些特殊情况&引用;“未绑定”;clojure函数中的变量,clojure,Clojure,我正在编写一个函数,将IRC RFC2813消息解析为它们的组成部分。它由两个函数组成,一个用于通过正则表达式拆分消息,另一个用于修改返回以处理某些特殊情况 (let [test-privmsg ":m@m.net PRIVMSG #mychannel :Hiya, buddy."]) (defn ircMessageToMap [arg] "Convert an IRC message to a map based on a regex" (println (str "IRCMapi
(let [test-privmsg ":m@m.net PRIVMSG #mychannel :Hiya, buddy."])
(defn ircMessageToMap [arg]
"Convert an IRC message to a map based on a regex"
(println (str "IRCMapifying " arg))
(zipmap [:raw :prefix :type :destination :message]
(re-matches #"^(?:[:](\S+) )?(\S+)(?: (?!:)(.+?))?(?: [:](.+))?$"
arg
)
)
)
(defn stringToIRCMessage [arg]
"Parses a string as an IRC protocol message, returning a map"
(let [r (doall (ircMesgToMap arg))])
(println (str "Back from the wizard with " r))
(cond
;Reformat PING messages to work around regex shortcomings
(= (get r :prefix) "PING") (do
(assoc r :type (get r :prefix))
(assoc r :prefix nil)
)
;Other special cases here
:else r)
)
我遇到的问题是,stringToIRCMessage
函数似乎没有实现ircMesgToMap的返回值。如果我计算(stringToIRCMessage test privmsg)
,则println
语句会给出:
使用Unbound从向导返回:#'irc1.core/r
..但控制台上会预先显示来自ircMessageToMap
的“ircmappifying”结果,表明已正确评估
<代码> doAL试图强迫结果在函数的中间实现-它没有效果。
如何重写此
stringToIRCMessage
函数以使r
变量可用?您的let
语句中的参数错误
应该是这样的:
(let [r (doall (ircMesgToMap arg)) ]
(println (str "Back from the wizard with " r))
(cond
;Reformat PING messages to work around regex shortcomings
(= (get r :prefix) "PING") (do
(assoc r :type (get r :prefix))
(assoc r :prefix nil)
)
;Other special cases here
:else r))
您的
let
语句中的参数是错误的
应该是这样的:
(let [r (doall (ircMesgToMap arg)) ]
(println (str "Back from the wizard with " r))
(cond
;Reformat PING messages to work around regex shortcomings
(= (get r :prefix) "PING") (do
(assoc r :type (get r :prefix))
(assoc r :prefix nil)
)
;Other special cases here
:else r))
我需要将函数的整个剩余部分放在
let
块下,只需要关心值r
的部分。它是“词汇范围”的,就像在Java、C等语言中一样(即,它是一个不存在的“局部变量”,即在块之外是“未绑定的”)。我的假设是,函数中的表单本身将其绑定到函数的范围。我需要将函数的整个剩余部分置于let
块下?仅关注值r
的部分。它是“词汇范围”的,就像在Java、C等语言中一样(即,它是一个不存在的“局部变量”,即在块之外是“未绑定的”)。我假设函数中的表单本身将其绑定到函数的范围。您还必须修复您的(do(assoc…)(assoc…)
,因为第一个没有效果。请记住Clojure值是不可变的,而且(g(f x))
与(do(f x)(g x))
非常不同。您还必须修复(do(assoc…)(assoc…)
,因为第一个值无效。请记住Clojure值是不可变的,并且(g(fx))
与(do(fx)(gx))
非常不同。