In case it is of some interest, the code below is what I use with jss. It's main element of interest is the "try-harder" flag, which uses setAccessible to allow setting some fields that would otherwise cause an exception.
Thanks, you are right, much better to use the built-in key stuff
(defun (setf jfield) (newvalue class-ref-or-field field-or-instance
&optional ( instance nil instance-supplied-p) unused-value)
(declare (ignore unused-value))
(if instance-supplied-p
(jfield class-ref-or-field field-or-instance instance newvalue)
(jfield class-ref-or-field field-or-instance newvalue)))
----- Original Message -----
From: "Thomas Russ" <tar@ISI.EDU>
To: <dmiles@users.sourceforge.net>
Sent: Tuesday, November 24, 2009 9:24 AM
Subject: Re: [armedbear-devel] SETF for JFEILDS
On Nov 23, 2009, at 6:47 AM, logicmoo@gmail.com wrote:
> So actually
>
> (defun (setf jfield) (newvalue class-ref-or-field field-or-
> instance &optional ( instance :noinst) unusedvalue)
> (if (eq instance :noinst)
> (jfield class-ref-or-field field-or-instance newvalue)
> (jfield class-ref-or-field field-or-instance instance newvalue)))
>
> Would be a little better.. good eye.
For what it's worth, I am not a fan of using special values to
determine whether optional (or keyword) arguments are actually passed
or not. I prefer to use the predicate forms from the lambda list, so
something more like
(defun (setf jfield) (newvalue class-ref-or-field field-or-instance
&optional ( instance nil instance-supplied-p)
unusedvalue)
(declare (ignore unusedvalue))
(if instance-supplied-p
(jfield class-ref-or-field field-or-instance newvalue)
(jfield class-ref-or-field field-or-instance instance newvalue)))
>
>
> ----- Original Message -----
> From: <dmiles@users.sourceforge.net>
> To: "Alessio Stalla" <alessiostalla@gmail.com>
> Cc: "Armed Bear" <armedbear-devel@common-lisp.net>
> Sent: Monday, November 23, 2009 6:27 AM
> Subject: Re: [armedbear-devel] SETF for JFEILDS
>
>
>>
>> ----- Original Message -----
>> From: "Alessio Stalla" <alessiostalla@gmail.com>
>> To: <dmiles@users.sourceforge.net>
>> Cc: "Armed Bear" <armedbear-devel@common-lisp.net>
>> Sent: Monday, November 23, 2009 5:42 AM
>> Subject: Re: [armedbear-devel] SETF for JFEILDS
>>
>>
>> On Mon, Nov 23, 2009 at 2:36 PM, <logicmoo@gmail.com> wrote:
>>>> Does anyone object to adding this to java.lisp? If not could it
>>>> be done?
>>>>
>>>> (defun (setf jfield)
>>>> (newvalue class-ref-or-field field-or-instance &optional
>>>> ( instance :noinst) (value :novalue))
>>>> (if (eq instance :noinst)
>>>> (jfield class-ref-or-field field-or-instance newvalue)
>>>> (jfield class-ref-or-field field-or-instance instance newvalue)))
>>
>>> It seems a nice idea to me, but there are a couple of things that I
>>> don't understand:
>>
>> A>- why :noinst and not simply nil?
>>
>> JFIELD is defined as: class-ref-or-field field-or-instance
>> &optional instance value
>> The valid argument patterns for this operation are:
>> (class-ref field-name): to retrieve the value of a static field.
>> (class-ref field-name instance-ref): to retrieve the value of a
>> class field of the instance.
>> (class-ref field-name primitive-value:) to store primitive-value
>> in a static field.
>> (class-ref field-name instance-ref value): to store value in a
>> class field of the instance.
>> (class-ref field-name nil value): to store value in a static
>> field (when value may be confused with an instance-ref).
>> (field-name instance): to retrieve the value of a field of the
>> instance. The class is derived from the instance.
>> (field-name instance value): to store value in a field of the
>> instance. The class is derived from the instance.
>>
>> JFIELD doesn't distingusih between static and non static fields
>>
>> Also cases of "class-ref field-name instance-ref
>> value" (accessing superclass field)
>>
>> Depending on how the field is defined
>>
>> (setf (jfield *MyClass* "someStaticBooleanField") NIL)
>> it is distinguable from
>> (setf (jfield *MySuperClass* "nonStaticBooleanField" *my-
>> instance* ) NIL)
>>
>>
>> --------------------------------------------------------------------------------------------------------------------------
>> A>- value is not used, what's the point of it?
>>
>> correct the "default :novalue" is not needed.
>> (I was debugging and trying to find corner cases with all those
>> bizzare legal jfield signatures )
>>
>>
>> but... "value" as an &optional was needed to match the signature
>> of what is legal for jfield so things like this can work:
>>
>> (define-symbol-macro %iscold (jfield "org.armedbear.lisp.Lisp"
>> "cold"))
>> %iscold ;; ==> NIL
>> (setq %iscold T) ;; ==> T
>> %iscold ;; ==> T
>> (setq %iscold NIL) ;; ==> NIL
>>
>>
>
> _______________________________________________
> armedbear-devel mailing list
> armedbear-devel@common-lisp.net
> http://common-lisp.net/cgi-bin/mailman/listinfo/armedbear-devel
_______________________________________________
armedbear-devel mailing list
armedbear-devel@common-lisp.net
http://common-lisp.net/cgi-bin/mailman/listinfo/armedbear-devel