(asdf:oos 'asdf:load-op 'ltk) (asdf:oos 'asdf:load-op 'cgn) (use-package :ltk) (use-package :cgn) (let ((n 0)) (defstruct range (id (incf n)) label from to (resolution 1)) (defstruct action (id (incf n)) text command) ) (defparameter *things* (make-hash-table)) (defparameter *inputs* '()) (defun reset-model () (setf *things* (make-hash-table)) (setf *inputs* '())) (defun things () (maphash #'(lambda (key value) (format t "~a = ~a ~%" key value)) *things*)) (defmacro defmodel (name parameters &body body) (let ((params1 (mapcar #'second parameters)) (side-effects (mapcar #'(lambda (x) (fx (first x) (second x) (cddr x))) parameters))) `(defun ,name ,params1 (with-ltk () (dolist (i ,*inputs*) (pack (convert-to-scale i))) ,@body)))) (defun convert-to-scale (range) (make-instance 'scale :from (range-from range) :to (range-to range) :resolution (range-resolution range))) (defun fx (isa name range) (case isa (:range (fx-range name range)) (:action (fx-action name fn)) (t (barph)))) (defun fx-range (name range) (let ((tmp (make-range :label name :from (first range) :to (second range)))) (if (= 3 (length range)) (setf (range-resolution tmp) (third range))) (setf (gethash name *things*) tmp) (setf *inputs* (append *inputs* (list tmp))) t)) (defmodel evett ((:range lambda 1 700) (:range in 1 5) (:range fvalue 0.1 0.25 0.1)) (+ lambda in fvalue))