2012-07-21 60 views
1

這可能是一個愚蠢的問題,或者至少有一個關於演員模型的假設不正確,但也許有人可以教育我。假設我建立一個類似一個例子演員cl-actors例如文檔cl-actors返回值

cl-user> (ql:quickload :cl-actors) 
:CL-ACTORS 

cl-user> (use-package :cl-actors) 
T 

cl-user> (defactor echo (stream) (message) 
      (format stream "~a~%" message) 
      next) 
ECHO 

cl-user> (defparameter e (echo :stream *standard-output*)) 
E 

cl-user> (send e "Test message") 
Test Message 
; No value 

中發現爲什麼會出現; No value存在的,而不是NIL?有沒有一種方法來獲取返回的值,而不會使用(bt:join-thread (cl-actors::get-thread e))(我懷疑在任何情況下都不會完全按照我想要的)殺死actor線程?我特別希望獲得回報價值,而不是玩with-output-to-string或類似的技巧。

我試圖解決的更一般問題,以防萬一您關心,試圖將來自演員的信息輸出到客戶端的cl-who頁面。東西沿線

(with-html-output (s) 
    (:h1 (send e "Test message"))) 

如果send不返回任何東西,這顯然不會工作。如果具體問題實際上被證明是愚蠢的,則歡迎指出更普遍的問題。

+0

@wvxvw - Yup;這就是爲什麼我把關於我試圖解決的更一般問題的說明放進去;有一羣演員互動很好,但我試圖將他們的網絡連接到Hunchentoot(一個不是演員的HTTP服務器,因此向它發送消息不是解決方案)。如果我想要做這樣的事情,我開始覺得我應該寫一個快速的基於演員的服務器。 – Inaimathi 2012-07-21 14:24:37

回答

0

我最終稍微改變了角色扮演者,並添加了一個send-receive構造,它可以在我們需要的情況下做到。修改後的代碼是here(意見鼓勵)。核心是這樣的:

(defmethod send-receive ((self actor) message &optional (timeout 0)) 
    (let ((tmp (make-queue))) 
    (send self tmp message) 
    (car (dequeue tmp timeout)))) 

本質上,我們聲明臨時隊列,將消息發送與該隊列作爲一個接收器,然後嘗試彈出一個值關它具有任選的超時(0裝置wait forever)。這取決於接受sender參數的目標參與者,這看起來像是一個足夠的actors y的方式去了解它..

0

您將流(*STANDARD-OUTPUT*)傳遞給您的actor,並將字符串打印到該流中。如果您傳遞Web請求輸出流,則會在該處打印字符串。如果您想要將數據返回給調用actor來執行某些操作,則應該傳遞其ID並將數據發回給它。