(clim:define-application-frame application () ((fat :accessor fat) (carbs :accessor carbs) (calories :accessor calories)) (:panes (fat-label (clim:make-pane 'clim:label-pane :label "Fat")) (carbs-label (clim:make-pane 'clim:label-pane :label "Carbs")) (fat-input (clim:make-pane 'clim:text-field)) (carbs-input (clim:make-pane 'clim:text-field)) (calories-output (clim:make-pane 'clim:text-field)) (button (clim:make-pane 'clim:push-button :label "Calculate" :activate-callback #'update-calories))) (:layouts (default (with-slots (fat carbs calories) clim:*application-frame* (setf fat fat-input carbs carbs-input calories calories-output) (clim:vertically (:width 300) (clim:tabling () (list fat-label fat-input) (list carbs-label carbs-input)) button calories))))) (defun update-calories (gadget) (declare (ignore gadget)) (let* ((fat (read-from-string (clim:gadget-value (fat clim:*application-frame*)))) (carbs (read-from-string (clim:gadget-value (carbs clim:*application-frame*)))) (calories (+ (* fat 9) (* carbs 4)))) (setf (clim:gadget-value (calories clim:*application-frame*)) (format nil "~d calorie~:p" calories)))) (defun run-application () (clim:run-frame-top-level (clim:make-application-frame 'application)))