&引用;“未绑定”;clojure函数中的变量

&引用;“未绑定”;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

我正在编写一个函数,将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 "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))
非常不同。