処理する必要があるメッセージを表す一連のクラスがあります。しかし、ハンドラのためのオープンスポットの量は限られています。したがって、メッセージオブジェクトを扱うハンドラの「ディスパッチ」は、まず空きがあるかどうかをチェックする必要があります。メソッドの組み合わせを使用してコードの複製を減らすことはできますが、早期返却を維持する方法
- >ディスパッチがある場合。
が存在しない場合 - >派遣し、私はそれをすることを強制する方法の組み合わせ機能を使用するのがベストだろう考え出しどの発送方法でも同じになりますこのコードの一部として、メッセージ
に対応する戻りません。しかし、私はどのように把握することはできません。私の現在のコードベースで
は、私が使用してみました:メソッドの前に、どうやらあなたは、このような文脈でリターンを使用することはできません。
(defclass message() ((msg :initarg :msg :reader msg)))
(defclass message-ext (message)
((univ-time :initarg :univ-time :reader univ-time)))
(defparameter *open-handler* nil)
(defgeneric handle (message)
(:documentation "handle the given message appropriately"))
(defmethod handle :before ((message message))
(when (> (length *open-handler*) 1)
(return :full)))
(defmethod handle ((message message))
(push (FORMAT nil "dispatched handler") *open-handler*))
(defmethod handle ((message-ext message-ext))
(push (FORMAT nil "dispatched ext handler") *open-handler*))
(handle (make-instance 'message :msg "allemeineentchen"))
(handle (make-instance 'message-ext
:msg "rowrowrowyourboat"
:univ-time (get-universal-time)))
(handle (make-instance 'message-ext
:msg "gentlydownthestreet"
:univ-time (get-universal-time)))
Execution of a form compiled with errors.
Form:
(RETURN-FROM NIL FULL)
Compile-time error:
return for unknown block: NIL
[Condition of type SB-INT:COMPILED-PROGRAM-ERROR]
Restarts:
0: [RETRY] Retry SLIME interactive evaluation request.
1: [*ABORT] Return to SLIME's top level.
2: [TERMINATE-THREAD] Terminate this thread (#<THREAD "worker" RUNNING {100594F743}>)
Backtrace:
0: ((SB-PCL::FAST-METHOD HANDLE :BEFORE (MESSAGE)) #<unavailable argument> #<unavailable argument> #<unavailable argument>)
1: ((SB-PCL::EMF HANDLE) #<unavailable argument> #<unavailable argument> #<MESSAGE-EXT {1005961733}>)
2: (SB-INT:SIMPLE-EVAL-IN-LEXENV (HANDLE (MAKE-INSTANCE 'MESSAGE-EXT :MSG "gentlydownthestreet" :UNIV-TIME (GET-UNIVERSAL-TIME))) #<NULL-LEXENV>)
3: (EVAL (HANDLE (MAKE-INSTANCE 'MESSAGE-EXT :MSG "gentlydownthestreet" :UNIV-TIME (GET-UNIVERSAL-TIME))))
4: ((LAMBDA() :IN SWANK:INTERACTIVE-EVAL))
は、このアプローチでも正気で、はい、私はそれをどのように行うことができれば働くファッション?