[Openmcl-devel] Errors Creating NSTimer
Gary Byers
gb at clozure.com
Tue Oct 23 22:20:17 PDT 2007
The first argument to any ObjC method should be the "receiver" (the
object - instance (usually) or class (sometimes) - that might implement
a method on the message. If this were CLOS, we might call the receiver
the first and only specialized parameter.)
In the case of
#/scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:,
the receiver is the class "NSTimer" (which happens to be the value
of the variable NS:NS-TIMER.) The bridge is complaining because
the first argument in your calls below either isn't a pointer at
all or isn't a pointer to an ObjC class or instance; getting a lisp-level
error like that is probably better than trying to send a message to
0.01d0 ...
On Tue, 23 Oct 2007, Brent Fulgham wrote:
> I'm trying to get the right Cocoa bridge syntax for calling:
>
> scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:
> Returns a new NSTimer object and adds it to the current NSRunLoop object in
> the default mode.
>
> + (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)seconds
> target:(id)target selector:(SEL)aSelectoruserInfo:(id)userInfo
> repeats:(BOOL)repeats
>
> NSTimeInterval is just a typedef to double, so I thought that I could just
> pass the double value to the function, since this is how many of the example
> Objective C programs are written, but this does not work for a variety of
> reasons:
>
> 1. If I attempt to simply use a bare double, it's not happy:
>
> (let* ((TimerInterval (ccl::%double-float 0.01)))
> (Timer
> (#/scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:
> TimeInterval (cocoa-view self) (objc:@selector #/animate) (ccl::%null-ptr)
> #$YES)))
>
>> Error: value 0.009999999776482582D0 is not of the expected type MACPTR.
>> While executing: CCL::SEND-UNAMBIGUOUS-MESSAGE, in process listener(1).
>
> 2. If I attempt to use an RLET to allocate the C Type, it's still not happy:
>
> (rlet ((TimeInterval :<NST>ime<I>nterval (ccl::%double-float 0.01)))
> (let* (
> (Timer
> (#/scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:
> TimeInterval (cocoa-view self) (objc:@selector #/animate) (ccl::%null-ptr)
> #$YES))))
> ;; add myself to list
> (pushnew Self (animated-views Self))))
>
>> Error: value #<A Foreign Pointer [stack-allocated] (:* DOUBLE-FLOAT)
>> #xB029BE70> is not of the expected type OBJC:OBJC-OBJECT.
>> While executing: CCL::SEND-UNAMBIGUOUS-MESSAGE, in process listener(1).
>
> I vaguely remember a mechanism to convert native C types to Cocoa analogs,
> but I cannot find documentation of this, and may be mixing Objective C up
> with something up.
>
> What's the correct way to deal with this particular API call?
>
> Thanks,
>
> -Brent
More information about the Openmcl-devel
mailing list