2012-09-03 25 views
0

我想使用标签名称列表来定义这些函数启动的线程的顺序/数量。但它不起作用,因为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))) 

使用,扩大了名单成宏:

(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)) 

的作品,但是这在我看来是不优雅,由于使用不必要的让和推。

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

回答

5

我目前无法访问SBCL来测试它,但问题似乎是您没有将函数传递给MAKE-THREAD,而是传递了符号。

替换此:

'(do-stuff do-stuff-II do-stuff) 

有了这个:

(list #'do-stuff #'do-stuff-II #'do-stuff) 

,它应该工作。

+0

我试过'(...)而不是(列表....)。使用(列表...)它的作品。 – Sim

+1

标准调度宏字符序列'#''相当于编写'function'形式,如'#'foo' ==='(function foo)'。如果你引用'(function foo)'表单,它将不会被处理。最接近的是'\'(,#'do-stuff,#'do-stuff-II,#'do-stuff)',但这与'list'表达式几乎相同。 – acelent