(defun callback (input output) (setf (gethash 'bar output) (mapcar #'- (gethash 'foo input)))) (defvar *petri-net-1* (make-petri-net '(foo bar) (list (make-transition 'foo 'bar #'callback)))) (defvar *petri-net-2* (petri-net () (foo -> #'callback -> bar))) (defun do-test (petri-net input-bag input output-bag output) (map nil (curry #'bag-insert (bag petri-net input-bag)) input) (funcall petri-net) (let ((contents (bag-contents (bag petri-net output-bag)))) (is (set-equal (coerce output 'list) (coerce contents 'list))))) (defun test-petri-net () (let ((input #(0 1 2 3 4 5 6 7 8 9)) (output #(0 -1 -2 -3 -4 -5 -6 -7 -8 -9)))) (do-test *petri-net-1* 'foo input 'bar output) (do-test *petri-net-2* 'foo input 'bar output))