Its now possible to write transactions that take transactions as parameters. Here are two short examples. The first one is `nob' which takes a transaction and turns it into a non-blocking one. It returns T on success or NIL on failure.
(deftransaction nob ((tx transaction)) (try (progn tx t) nil))
And with it we can define lots and lots of new operators, like `try-put'.
(deftransaction try-put ((cell cell) value) (nob (put cell value)))
STM> (defvar *cell* (new 'cell)) *CELL* STM> (perform (try-put *cell* 'hello) :wait? t) T STM> (perform (try-put *cell* 'hello) :wait? t) NIL
In the source code, there is a better version of `nob' which returns T and the values of the transaction.
The next example is `repeat' which executes a transaction n times.
(deftransaction repeat ((tx transaction) n) (if (= n 1) tx (progn tx (repeat tx (- n 1)))))
STM> (defvar *counter* (new 'counter :count 1)) *COUNTER* STM> (perform (repeat (increment *counter* 3) 3) :wait? t) 10
Pretty cool huh?
Hoan