Kenny, Cell'ers:
I have defined a macro defapp as a convenience macro for defining Cello applications:
;;; ------------------------------------------------------------------------ ---- ;;; defapp - Define an applicatin window to be run as a Cello app. MACRO ;;; ------------------------------------------------------------------------ ---- ;;; Arguments are normal defclass arguments. Creates a class as a subclass of ;;; gt.app using Cells' defmodel. ;;; ;;; Side effects: ;;; Two other functions %%RUN-... and RUN-... are defun'd (all %%... named fns ;;; are purely internal functions not to be called outside of this package!!!) ;;; A (defapp my-app ... ) defines the user callable fn RUN-MY-APP. ;;; This function is to be called to run the application my-app. ;;; ;;; STATUS: Released.
(defmacro defapp (class directsupers slotspecs &rest options) `(prog1 (defmodel ,class ,(or directsupers '(gt.app)) ,slotspecs ,(car options)) (finalize-inheritance (find-class ',class)) (defun ,(intern (conc$ "%%RUN-" (symbol-name class))) (w-t-f) (declare (ignore w-t-f)) (cl-user::gc t) ;; Oddity in ACL: without gc-ing here ACL errors (cells-reset 'ctk:tk-user-queue-handler) (wands-clear) (ctk::test-window ',class)) (defun ,(intern (conc$ "RUN-" (symbol-name class))) () (mk-thread ,(with-output-to-string (stream) (format stream "APPLICATION-THREAD-~A" (symbol-name class))) ',(intern (conc$ "%%RUN-" (symbol-name class))))) (export ',(intern (conc$ "RUN-" (symbol-name class)))) (export ',(intern (symbol-name class))) ))
The class gt.app is defined as:
;;; ------------------------------------------------------------------------ ---- ;;; gt.app - Application Base Class CLASS ;;; ------------------------------------------------------------------------ ---- ;;; STATUS: Released.
(defmodel gt.app ( cello-window ) ((.md-name :cell t :accessor id :initform (c-in nil) :initarg :id :documentation "The model ID of the instance of the application.") (init-fn :cell nil :accessor init-fn :initform nil :initarg :initfn :documentation "Function to be called before running the application.") (status :cell t :accessor status :initform (c-in nil) :initarg :status :documentation "Status := { :CREATED | :INITIALIZING | :RUNNING | :SHUTTDING- DOWN | :HALTED | :BLOCKED }") (opcode :cell t :accessor opcode :initform (c-in nil) :initarg :opcode :documentation "Operation Code := { :INIT | :RUN | :SHUTDOWN }") (current-opcode-task :cell t :accessor current-opcode-task :initform (application-current-opcode-task-cell-rule) :initarg :current-opcode-task :documentation "Holds the Cell Rule to execute a task depending on the opcode slot.") (main-thread :cell t :accessor main-thread :initform (c-in nil) :initarg :main-thread :documentation "Holds the thread object created by RUN-... (which calls mk- thread)")) (:documentation "gt.app - Application Base Class CLASS"))
Using the macro like this:
(defapp my-app () () (:default-initargs :id :my-app :kids (c? (the-kids (mk-stack (:packing (c?pack-self)) (mk-row () (mk-label :text "Status : " :width 15) (mk-label :text (c_? (status (fm-other :my-app))))) (mk-row () (mk-label :text "Opcode : " :width 15) (mk-label :text (c_? (opcode (fm-other :my-app))))))))))
expands into:
(PROG1 (DEFMODEL MY-APP (GT.APP) NIL (:DEFAULT-INITARGS :ID :MY-APP :KIDS (C? (THE-KIDS (MENUBAR) (MK-STACK (:PACKING (C?PACK-SELF)) (MK-ROW NIL (MK-LABEL :TEXT "Status : " :WIDTH 15) (MK-LABEL :TEXT (C_? (STATUS (FM-OTHER :MY-APP))))) (MK-ROW NIL (MK-LABEL :TEXT "Opcode : " :WIDTH 15) (MK-LABEL :TEXT (C_? (OPCODE (FM-OTHER :MY-APP)))))))))) (FINALIZE-INHERITANCE (FIND-CLASS 'MY-APP)) (DEFUN %%RUN-MY-APP (GT.APP.BASE::W-T-F) (DECLARE (IGNORE GT.APP.BASE::W-T-F)) (EXCL:GC T) (CELLS-RESET 'TK-USER-QUEUE-HANDLER) (MGK:WANDS-CLEAR) (TEST-WINDOW 'MY-APP)) (DEFUN RUN-MY-APP () (GT.APP.BASE::MK-THREAD "APPLICATION-THREAD-MY-APP" '%%RUN-MY-APP)) (EXPORT 'RUN-MY-APP) (EXPORT 'MY-APP))
I can see no error in this. Yet there are undefined functions status and opcode:
;;; Compiling file /tmp/tempa24242105201 ;;; Writing fasl file /tmp/tempa24242105201.fasl ;;; Fasl write complete Warning: While compiling these undefined functions were referenced: STATUS from position 336 in #1=test.lisp;483 OPCODE from position 336 in #1#
While this is a clear error message I don't see what I can against nor where my error is.... Any help really appreciated !!! TIA!
Frank