配列の並列処理 - lisp-cookbook-ja/common-lisp GitHub Wiki
一つの配列を複数のタスクに分けて処理する例です。
下記の例では、CLiki:Xecto を利用しています。
ライブラリの導入方法 (今のところSBCLのみ対応)
;;; #("1" "2" "3" ...)というような整数を文字列にしたものを要素にもつ配列
(declaim ((simple-vector 100000) *number-strings*))
(defvar *number-strings*
(make-array 100000))
;; 初期化
(dotimes (i 100000)
(setf (svref *number-strings* i)
(write-to-string i)))
;;; 数字を要素に持つ配列
(declaim ((simple-array integer (100000)) *numbers*))
(defvar *numbers*
(make-array 100000))
(aref *number-strings* 100)
;=> "100"
(aref *numbers* 100)
;=> 0
処理例
(defconstant max-threads 2)
(progn
(parallel-future:with-context (max-threads) ;max-threadsの値まで並列実行
(parallel:dotimes (i (length *numbers*))
:wait ;ループごとのボディ部の実行完了を待つ
(setf (aref *numbers* i)
(parse-integer (aref *number-strings* i)))))
(reduce #'+ *numbers*))
;=> 4999950000