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

_______________________________________________
cells-devel site list
cells-devel@common-lisp.net
http://common-lisp.net/mailman/listinfo/cells-devel

Reply via email to