[bknr-devel] Deftransaction and &rest args

Vladimir Sedach vsedach at gmail.com
Sat Dec 10 22:52:07 UTC 2011


Hi Hans,

This is the smallest error scenario I have come up with:

DATASTORE> (open-store "/home/viper/tmp/test-store/")
initializing store random state
restoring #<STORE DIR: "/home/viper/tmp/test-store/">
#<STORE DIR: "/home/viper/tmp/test-store/">
DATASTORE> (defclass test-object (store-object)
             ((test-slot :initform '(1 2 3)))
             (:metaclass persistent-class))
#<PERSISTENT-CLASS TEST-OBJECT>
DATASTORE> (slot-value (make-instance 'test-object) 'test-slot)
(1 2 3)
DATASTORE> (deftransaction set-test-slot (object &rest args)
             (setf (slot-value object 'test-slot) args))
SET-TEST-SLOT
DATASTORE> (slot-value (car (store-objects-with-class 'test-object)) 'test-slot)
(1 2 3)
DATASTORE> (set-test-slot (car (store-objects-with-class 'test-object)) 3 4 5)
NIL
DATASTORE> (slot-value (car (store-objects-with-class 'test-object)) 'test-slot)
NIL

Actually, looking in txn.lisp (line 422):
,@(let ((rest (member '&rest args)))
    (when rest `((declare (ignore ,(second rest))))))

And line 427 when making the transaction, make-args is called during
macroexpansion, which does the following:

(make-args '(foo &rest bar)) => (FOO)

This is why I assumed that &rest args were left out for a reason but
warnings/documentation was just forgotten.

Vladimir

On Wed, Dec 7, 2011 at 3:40 AM, Hans Hübner <hans.huebner at gmail.com> wrote:
> Hi Vladimir,
>
> I have looked at the source of deftransaction and the method
> definitions for encode-object and decode-object for transactions - The
> &rest arguments seem to be passed to the transaction object as :args
> initarg, stored in the transaction file in the encoder and also read
> back in the decoder.  So, the intention is that they are recorded.
> Did you see that not work?
>
> -Hans
>
> On Wed, Dec 7, 2011 at 4:36 AM, Vladimir Sedach <vsedach at gmail.com> wrote:
>> Hello,
>>
>> Deftransaction permits &rest args, but they don't seem to be recorded
>> in the store. Is the correct behavior that &rest args should not be
>> valid in a deftransaction lambda-list, or is this a bug in storing
>> them?
>>
>> Thanks,
>> Vladimir
>>
>> _______________________________________________
>> bknr-devel mailing list
>> bknr-devel at common-lisp.net
>> http://lists.common-lisp.net/cgi-bin/mailman/listinfo/bknr-devel




More information about the Bknr-devel mailing list