Ho ottenuto un set di classi che rappresentano un messaggio che deve essere gestito. Ma c'è solo una quantità limitata di punti aperti per i gestori. Pertanto, ogni "invio" di un gestore che gestisce un oggetto messaggio deve verificare prima se c'è un posto libero.Come ridurre la duplicazione del codice utilizzando la combinazione di metodi ma mantenendo possibile il ritorno anticipato
Se c'è -> invio.
Se non c'è -> non inviare e restituire un messaggio
corrispondente Dato che questa parte del codice sarà lo stesso in qualsiasi metodo di spedizione ho pensato che sarebbe stato meglio utilizzare l'impianto metodo di combinazione di far rispettare che ma non riesco a capire come.
Nella mia base di codice corrente ho cercato di usare una: prima di metodo, ma a quanto pare non è possibile utilizzare il ritorno in tale contesto:
(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))
È questo approccio ancora sano di mente, e se sì, come posso farlo in una moda lavorativa? (Ho già provo return-from
con lo stesso risultato)