如何使用标签名称列表来启动线程

Sim*_*Sim 0 multithreading sbcl common-lisp

我想使用标签名列表来定义用这些函数启动的线程的顺序/数量.但它不起作用,因为SBCL抱怨:

DO-STUFF不会退化.

例如:

(labels ((do-stuff (argI argII) (values argI argII))
         (do-stuff-II (argI argII) (values argII argI)))
  (mapcar #'(lambda(name)
              (sb-thread:make-thread name :arguments '(1 2)))
          '(do-stuff do-stuff-II do-stuff)))
Run Code Online (Sandbox Code Playgroud)

使用宏将列表扩展为:

(labels ((do-stuff (argI argII) (values argI argII))
         (do-stuff-II (argI argII) (values argII argI)))
  (let ((threads nil))
    (push (sb-thread:make-thread #'do-stuff :arguments '(1 2)) threads)
    (push (sb-thread:make-thread #'do-stuff-II :arguments '(1 2)) threads)
    (push (sb-thread:make-thread #'do-stuff :arguments '(1 2)) threads)
    threads))
Run Code Online (Sandbox Code Playgroud)

有效,但由于使用了不必要的让和推动,这让我觉得不那么优雅.

我该如何修复我的第一种方法?我必须写一个宏吗?

jwm*_*wmc 5

我目前无法访问SBCL进行测试,但问题似乎是你没有将函数传递给MAKE-THREAD,而是传递符号.

替换这个:

'(do-stuff do-stuff-II do-stuff)
Run Code Online (Sandbox Code Playgroud)

有了这个:

(list #'do-stuff #'do-stuff-II #'do-stuff)
Run Code Online (Sandbox Code Playgroud)

它应该工作.