[Openmcl-devel] how to access non NS classes

R. Matthew Emerson rme at clozure.com
Fri Oct 30 23:17:28 PDT 2009

On Oct 31, 2009, at 1:50 AM, Alexander Repenning wrote:

> There is a really handy class to get images from the build in camera
> called IKPictureTaker class
> I cannot access it.
> (eval-when (:compile-toplevel :load-toplevel :execute)
>   (ccl:use-interface-dir :quartz)
>   (open-shared-library "/System/Library/Frameworks/Quartz.framework/
> Versions/A/Frameworks/ImageKit.framework/ImageKit"))

Or just use (objc:load-framework "Quartz" :quartz)

> seems to find something
> but
> ns::IK-Picture-Taker , i.e., the class, is not bound
> ImageKit is part of Quartz which is part of the x86 headers. Could
> this be a version problem? IKPictureTaker is available in Mac OS X
> v10.5 and later. Strangely, the methods of IKImagePicker are
> available, e.g., (#/
> popUpRecentsMenuForView:withDelegate:didEndSelector:contextInfo:  ...)
> I am guessing I just doing something silly when trying to access the
> class but what?

The heuristics used by the Objective-C bridge to map from CamelCase  
names to hyphen-separated names don't always do the right thing,  
especially when Apple adds new prefixes like "IK".

The bridge can recognize special Objective-C "words" and not split  
them up.  See ccl:objc-bridge;name-translation.lisp.

Since the bridge doesn't recognize "IK" as a "special word", the  
bridge translates the class name to ns:i-k-picture-taker. You could  
also use (@class "IKPictureTaker").

(#/runModal (#/pictureTaker ns:i-k-picture-taker)) ought to work (on  
x8664 anyway...some ports still use Tiger interfaces).

More information about the Openmcl-devel mailing list