1

これはばかげた質問かもしれませんし、少なくともアクター モデルに関する誤った仮定を含む質問かもしれませんが、誰かが私を教えてくれるかもしれません。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))ますか? 私は特に戻り値を取得することを目指しており、トリックをしwith-output-to-stringたり、同様のことをしたりしません。

私が解決しようとしているより一般的な問題は、アクターからcl-whoクライアント側のページに情報を出力しようとすることです。の線に沿った何か

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

send何も返さない場合、明らかに機能しません。特定の質問が実際にばかげていることが判明した場合は、より一般的な問題へのポインタを歓迎します。

4

2 に答える 2

0

ストリーム ( *STANDARD-OUTPUT*) をアクターに渡し、そのストリームに出力された文字列を取得します。Web リクエストの出力ストリームを渡すと、そこに文字列が出力されます。呼び出し元のアクターにデータを返して何かをしたい場合は、ID を渡してデータを送り返す必要があります。

于 2012-07-21T19:33:20.463 に答える
0

cl-actors を少し変更send-receiveし、この状況で必要なことを行う構成を追加しました。変更されたコードはこちらです(コメントをお勧めします)。コアはこれです:

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

基本的に、一時キューを宣言し、そのキューを受信者としてメッセージを送信し、オプションのタイムアウト ( 0means wait forever) を使用して値をポップしようとします。senderこれは、パラメーターを受け入れるターゲット アクターに依存しactorsます。

于 2012-08-10T13:19:07.100 に答える