LINUX.ORG.RU

[CL] Агенты/Акторы


0

2

Нужен асинхронный Message Passing в Common Lisp. Знает ли кто-нибудь готовые библиотеки?

К сожалению, сеанс гугления результатов положительных не дал. Нашел только это: http://lethain.com/entry/2008/jan/03/actors-common-lisp/.

Должно быть что-то похожее на:

  • агенты в clojure;
  • акторы в Scala;
  • агенты MailboxProcessor в F#.
★★★★★

На основе cl-zmq что-нибудь придумать, не?

anonymous
()
Ответ на: комментарий от antares0

Спасибо! То, что нужно.

dave ★★★★★
() автор топика

Есть ещё cl-muproc: http://common-lisp.net/project/cl-muproc/

Немного с ним игрался, обнаружил баг на sbcl, связанный с не очень корректным использованием финализации. Вот фикс:

diff --git a/muproc-sbcl.lisp b/muproc-sbcl.lisp
index 8d7efa1..f77a866 100644
--- a/muproc-sbcl.lisp
+++ b/muproc-sbcl.lisp
@@ -39,11 +39,11 @@ in error and signal handlers - default no-op implementation"
 
 ;; It is safe probably to accesss hash-table without lock under SBCL.
 ;; All basic operations are protected by spinlocks.
-(defvar *process-plists* (make-hash-table :test #'eq))
+(defvar *process-plists* (make-hash-table :test #'eq :weakness :key))
 
 (declaim (inline process-id))
 (defun process-id (muproc)
-  (slot-value muproc 'sb-thread::os-thread))
+  muproc)
 
 (declaim (inline process-plist))
 (defun process-plist (muproc)
@@ -75,7 +75,6 @@ in error and signal handlers - default no-op implementation"
 (defun %process-run-function% (name fn &rest args)
   (let ((muproc (make-thread #'(lambda () (apply fn args)) :name name)))
     (setf (process-plist muproc) '())
-    (sb-ext:finalize muproc (mk-drop-process-plist muproc))
     muproc))
 
 ;;; TIMERS
slav ★★
()
Ответ на: комментарий от slav

Интересная библиотека. О фиксе буду помнить.

dave ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.