2017-04-06 8 views
2

私は最近SBCLでネストされたforループを扱っています。私は、マップすることができる操作をpmap(または同様の関数)を使って簡単に並列化できることを発見しました。私は、次のように試してみて、ループ並列のための私の二重を作ることを決めた:SBCLの共通リスプ、ループ内でpmapを使用

基本ループ:

(loop for element in list_of_lists 
    do (loop for element2 in list_of_lists2 
     ...(random_function element element2))) 

そして、これが正常に動作しますが、まだのようなものならば、私は思っていた:

(defun supplementary_function (single_list list_collection) 
    "This function iterates through list_collection and executes (random_function) on pairs obtained" 
    (loop for element in list_collection 
     do (random_function single_list element))) 

(map 'nil (lambda (x) (supplementary_function x list_of_lists2)) list_of_lists1) 

この場合のマップは私の場合には簡単にpmapに置き換えることができるので、パフォーマンスの向上のためにこれを望みます。

最初のループをマップで置き換えることができます。各マップ操作では、2番目のループは、1番目のループと全体の1つの要素を使用する特殊な関数内で実行されます2番目のループ。どうしてこのようなことができないはずなのかという概念的な間違いはないのですが、何らかのメモリーエラーが発生します(?)

ありがとうございました!

答えて

2

これは役に立ちますか?

(loop for e1 in '(1 2 3 4 5) 
     do (loop for e2 in '(a b c d e) 
       do (print (list e1 e2)))) 

がある

(mapc (lambda (e1) 
     (mapc (lambda (e2) 
       (print (list e1 e2))) 
       '(a b c d e))) 
     '(1 2 3 4 5)) 

(defun f (e1 e2s) 
    (mapc (lambda (e2) 
      (print (list e1 e2))) 
     e2s)) 

(mapc (lambda (e1) 
     (f e1 '(a b c d e))) 
     '(1 2 3 4 5)) 
+0

魅力的です、ありがとうございました!これは完全に明確になります。 –

関連する問題