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)
有效,但由于使用了不必要的让和推动,这让我觉得不那么优雅.
我该如何修复我的第一种方法?我必须写一个宏吗?
我目前无法访问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)
它应该工作.
| 归档时间: |
|
| 查看次数: |
110 次 |
| 最近记录: |