(asdf:oos 'asdf:load-op 'ltk) (asdf:oos 'asdf:load-op 'cgn) (use-package :ltk) (use-package :cgn) (defparameter *inputs* (make-hash-table)) (defparameter *action-function* nil) (defun reset-inputs () (setf *inputs* (make-hash-table)) (setf *action-function* nil)) (defun convert-to-instance (keyword) (let ((key (car keyword)) (name (second keyword)) (vals (cddr keyword)) tmp) (cond ((equal key :scale) (progn (setf tmp `(make-instance 'scale ,:master main-label ,:label ,(format nil "~A" name) ,:from ,(first vals) ,:to ,(second vals) ,:resolution ,(or (third vals) 1) :orientation 'horizontal)) (setf (gethash name *inputs*) tmp))) ((equal key :action) (progn (setf *action-function* name) (setf tmp `(make-instance 'button ,:command name)))) ) (format t "~A ~A ~A ~A ~%" key name vals tmp) tmp)) (defmacro defmodel (name inputs &body action) (let (lst letz letz2) (dolist (i inputs) (setf lst (append lst (list (convert-to-instance i))))) (setf letz (append letz (list `(main-frame (make-instance 'frame))))) (setf letz (append letz (list `(main-label (make-instance 'labelframe :text "Inputs"))))) (setf letz (append letz (list `(action-frame (make-instance 'frame))))) (setf letz (append letz (list `(action-label (make-instance 'labelframe :text "Action"))))) (setf letz (append letz (list `(action2 (make-instance 'button :text "Generate" :command #'(lambda () (format t "ok!~%"))))))) (maphash #'(lambda (k v) (setf letz (append letz (list (list k v))))) *inputs*) (maphash #'(lambda (k v) (format t "~A ~A ~%" k v)) *inputs*) (setf letz2 (mapcar #'(lambda (l) `(pack ,l)) (mapcar #'first letz))) (format t "~A ~%" letz) `(defun ,name () (with-ltk () (let* ,letz ; (maphash #'(lambda (k v) (pack k)) *inputs*) ,@letz2 ))))) (defmodel evett ( (:scale lamb 1 10) (:scale fvalue .5 1.5 .1) (:action #'osnap) )) (defun osnap () (+ 1 1))