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

動作しますが、不要なlet and pushを使用しているため、これはエレガントではありません。

最初のアプローチを修正するにはどうすればよいですか?マクロを作成する必要がありますか?

4

1 に答える 1

5

現在、SBCLにアクセスしてテストすることはできませんが、問題は、関数をMAKE-THREADに渡していない、シンボルを渡していることのようです。

これを置き換えます:

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

これとともに:

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

そしてそれはうまくいくはずです。

于 2012-09-03T13:14:49.347 に答える