This is the mail archive of the
kawa@sourceware.org
mailing list for the Kawa project.
Re: Macros for Android
On 07/26/2012 12:29 AM, craven@gmx.net wrote:
That gives me the following version:
(define-syntax-case
do-in-background ()
((_ dib-param dib opu-param opu params)
#`(let* ((async-task :: <android.os.AsyncTask>
(object (<android.os.AsyncTask>)
((doInBackground dib-param :: <java.lang.Object[]>) :: <java.lang.Object>
dib)
((onProgressUpdate opu-param :: <java.lang.Object[]>)
opu))))
(<android.os.AsyncTask>:execute async-task (apply <java.lang.Object[]> params)))))
which ... gives the error:
test.scm:235:7: missing method name
The problem is that object.scanClassDef doesn't handle
a syntax object - just raw symbols. This is a bug (maybe not if
you're a super-hard-core hygiene purist).
A work-around is to make sure object.scanClassDef gets a raw
symbol. The following seems to work:
(defmacro do-in-background (dib-param dib opu-param opu params)
`(let* ((async-task :: <android.os.AsyncTask>
(object (<android.os.AsyncTask>)
((#,'doInBackground ,dib-param :: <java.lang.Object[]>) ::
<java.lang.Object>
,@dib)
((#,'onProgressUpdate ,opu-param :: <java.lang.Object[]>)
,@opu))))
(<android.os.AsyncTask>:execute async-task (<java.lang.Object[]>
,@params))))
Using EXPAND with OBJECTX instead of OBJECT shows that the macro itself
seems to work fine. Could there be some unfortunate interaction between
OBJECT and the macro?
I wouldn't say that. The expand macro does not support ObjectExp
(or from what I can tell ClassExp). See unrewrite in syntaxutils.scm.
Instead, we end up in the gnu.expr.LambdaExp case, since ObjectExp
(and ClassExp and ModuleExp) inherit from LambdaExp).
--
--Per Bothner
per@bothner.com http://per.bothner.com/