AE
Size: a a a
AE
SA
SA
V(
AE
AE
AE
AE
ХЛ
PG
V(
ХЛ
V(
ХЛ
V(
PG
SA
SA
a
(defmacro mk-calculation (plist &body body)
`(let ((params ,plist)
(runner-string (quote ,@body))
(status 'new))
(labels ((all-params () params)
(get-param (key) (getf params key))
(set-param (key val) (setf (getf params key) val))
(get-status () status)
(set-status (sym) (setf status sym)))
(lol:dlambda
(:get (key) (get-param key))
(:status () status)
(:show-runner () runner-string)
(:run () (progn ,@body
(setf status 'finished)))
(t () (cons (cons 'calculation status) (list params)))))))
:run
, в принципе один раз и с кучей сайд-эффектов. Чтобы можно было сериализовать и перезапускать это чудо, в runner-string
пишется quote еще не скомпилированного body; в labels
опред. сеттеры для стэйта этого_конкретного_объекта.(quote ,@body)
:show-runner
будет ошибкой если в body
0 форм или более 1 формы.(:run () ,@body (setf status 'finished))
(это позволит прозрачно пропихнуть declare-форму через body, например)