我无耻地从我发现的一个示例博客中提取了几乎所有这些代码(但现在似乎无法检索),这些博客使用Java的套接字实现来维护简单的IRC连接.
虽然玩这个例子我遇到了一个问题,我想加入一系列频道.我的第一个想法是在服务器var上存储一个通道向量,然后在模式匹配时对其进行解构.然而,这至今没有奏效.如果我将地图更改为写入函数的裸调用,则可以正常工作.但是映射写入功能似乎不起作用,我不知道为什么.有趣的是,如果我将地图调用复制并粘贴到运行活动连接的repl中,它就可以工作......所以这是因为这发生在cond的范围内吗?裁判可能会受到指责吗?我刚刚进入Clojure所以我仍然非常想弄清楚事情.
不用多说了,这是代码:
(ns irc
(:import (java.net Socket)
(java.io PrintWriter InputStreamReader BufferedReader)))
(def server {:server "irc.example.net"
:port 6667
:channels ["#a" "#b"]})
(def client {:realname "Lambda Bot" :nick "lambdabot"})
(declare conn-handler)
(defn in [a b]
(re-find (re-pattern a) b))
(defn startswith [a b]
(in (str "^" a) b))
(defn connect [server]
(let [socket (Socket. (:server server) (:port server))
in (BufferedReader. (InputStreamReader. (.getInputStream socket)))
out (PrintWriter. (.getOutputStream socket))
conn (ref {:in in :out out})]
(doto (Thread. #(conn-handler conn server)) (.start))
conn))
(defn write [conn msg]
(println msg)
(doto (:out @conn)
(.println (str msg "\r"))
(.flush)))
(defn conn-handler [conn server]
(while (nil? (:exit @conn))
(let [msg (.readLine (:in @conn))]
(println msg)
(cond
(startswith "ERROR :Closing Link:" msg)
(dosync (alter conn merge {:exit true}))
(in " 001 " msg)
;; this guy below doesn't seem to work at all
(map #(write conn (str "JOIN " %)) (:channels server))
;; this guy on the other hand seems to work fine
;;(write conn (str "JOIN " (first (:channels server))))
(startswith "PING" msg)
(write conn (str "PONG " (re-find #":.*" msg)))))))
(defn login [conn user]
(write conn (str "NICK " (:nick user)))
(write conn (str "USER " (:nick user) " 0 * :" (:realname user))))
Run Code Online (Sandbox Code Playgroud)
要运行它,您只需调用:(def irc(连接服务器))然后(登录irc客户端).任何帮助非常感谢!谢谢.
map是一个惰性操作,即直到需要它才会执行.当从repl调用时,repl会使其进行评估,因为它需要打印返回的值.
您可以使用doall强制执行延迟操作.
(doall (map ... ))
Run Code Online (Sandbox Code Playgroud)
更好的是使用doseq而不是map.map用于将一组值转换为另一组值,并且doseq是对一组值执行操作以及您要执行的操作.
(doseq [ch (:channels server)]
(write conn (str "JOIN " ch)))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
120 次 |
| 最近记录: |