ZeroMQ 的通用 lisp 绑定

common lisp bindings for 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

我做错了什么?

这一行

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

造成这个错误

The variable ZEROMQ:REP is unbound.

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

在我看来,代码需要关键字符号 :rep 作为套接字类型描述符,而不是您的 zmq:rep.

另一种错误宏未检查其预期类型的​​情况。