ZeroMQ的常见lisp绑定

时间:2016-05-31 21:09:25

标签: common-lisp zeromq

我是Lisp的新手并且正在努力学习。特别是,我试图使用ZeroMQ库来制作分布式系统。 这是我的探索性代码

;;hwserver.lisp
(defun main()
  ;; prepare contexts
  (zmq:with-context (context)
    (zmq:with-socket (socket context zmq:rep)
      (zmq:bind socket "tcp://*5555")

      (loop
     (let ((request (make-instance 'zmq:msg)))

       ;; wait for next request from client
       (zmq:recv socket request)
       (print "received request: [~A]~%"
            (zmq:msg-data-as-string request))

       ;;do some work
       (sleep 1)

       ;;send reply back to client
       (let ((reply (make-instance 'zmq:msg :data "Hello World")))
         (zmq:send socket reply))))))
  (sb-ext:exit))

在REPL中,我运行以下命令

(ql:quickload "zeromq")
(load "hwserver.lisp")

然后我收到以下警告。

; 
; caught WARNING:
;   undefined variable: ZEROMQ:REP
; 
; compilation unit finished
;   Undefined variable:
;     ZEROMQ:REP
;   caught 1 WARNING condition

虽然zmq:rep是从zeromq package导出的。

如果我忽略该警告尝试运行(main),我会收到以下错误

The variable ZEROMQ:REP is unbound.
   [Condition of type UNBOUND-VARIABLE]

Restarts:
 0: [RETRY] Retry SLIME REPL evaluation request.
 1: [*ABORT] Return to SLIME's top level.
 2: [ABORT] abort thread (#<THREAD "repl-thread" RUNNING {10039B0003}>)

Backtrace:
  ;; backtrace omitted for being uninteresting here

我在这里做错了什么?

1 个答案:

答案 0 :(得分:3)

这一行

  

(zmq:with-socket(socket context zmq:rep)

创建此错误

  

变量ZEROMQ:REP未绑定。

意思是:它是一个变量,没有任何价值。是否导出符号无关紧要。

对我而言,代码需要一个关键字符号:rep作为套接字类型描述符而不是zmq:rep

另一种错误的宏没有检查它所期望的类型。