[Openmcl-devel] Questions about Cocoa app development]

mikel evins mevins at mac.com
Thu Jan 24 14:43:33 PST 2008


On Jan 24, 2008, at 13:10:08 +0100, Didier Verna  
<didier at lrde.epita.fr> wrote:
>
>
>       Hello,

Hi, Didier!

>
> I'm interested in developing some Cocoa/GUI applications in CL, and it
> seems to me that CCL is the best tool for that right now. So I tried  
> it
> for the first time and went through the Currency Converter tutorial. I
> must admit I was quite puzzled by the simplicity of delivering a Mac
> application !!
>
> I have some general questions and also some about the tutorial itself:
>
> 1/ How can you develop a GUI application interactively, or at least  
> have
> a GUI application combined with a listener so that you can inspect
> things during development ?

You can use EasyGUI:

http://trac.clozure.com/openmcl/wiki/EasyGuiCurrencyConverter

...or you can use Cocoa and put up with some amount of inconvenience.  
You can use Cocoa classes and method calls to create GUI elements and  
manipulate them. You might have to do a certain amount of crawling  
around Apple's documentation to figure out the specific things you  
want to do. Over time, I hope I'll be adding some more HOWTO docs that  
show how to do various things of that nature.

As for interacting with your application, well, you can build a  
Listener into it. It used to be that my Bosco framework built a SLIME  
interface into applications automatically. When I folded Bosco into  
OpenMCL proper, I omitted that feature in order to get things done and  
working more quickly. But making it easier to interact with the Lisp  
in a built application is still on my list of things to do. Feel free  
to send suggestions for how you'd like it to work.

> 2/ How do you execute specific Lisp code when the application starts,
> both before and after the GUI is setup ?
>

One Cocoa-flavored way to do it is to create an application delegate  
and implement the methods applicationWillFinishLaunching: and  
applicationDidFinishLaunching:. You can implement these in Lisp and  
have them evaluate arbitrary Lisp forms. Apple documentation of these  
and other delegate methods is here:

http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Classes/NSApplication_Class/Reference/Reference.html#/ 
/apple_ref/doc/uid/20000012-BAJFJIIB

You can define the class and methods the same way it's done in the  
Lisp code in the Currency Converter example.

> And about the tutorial itself:
>
> 1/ I don't quite understand the point in having an instance of the
> converter class visible at the Cocoa layer.
> The way I see it (correct me
> if I'm wrong), I want the Lisp layer to perform the actual work, and
> the Cocoa layer only to display stuff and to get input. So the
> converter-controller should be the only interface between the two
> worlds.

> Hypothesis: having the controller visible down below, as an outlet in
> the converter-controller class, lets the cocoa layer instanciate it at
> the right time, and avoids the need for a global variable to access it
> from the controller's methods ??
>

The main point is to make the example as much as possible like Apple's  
example. Apple does it that way, so I do it that way.

In addition, we expose an Objective-C "Converter" class because that  
way we can instantiate it in the nibfile; having instantiated it in  
the nibfile, we can then create outlet connections to it. That means  
that when the application launches, it will automatically instantiate  
the class and store references to it in the appropriate outlets, which  
means we don't have to write code to do any of that.

That's kind of convenient, and might be a good reason to do it that  
way, but the real reason I did it that way is because that's the way  
Apple's example does it.

> 2/ In the same vein, why having the actual work, ie the  
> convertCurrency
> method defined in the Objc layer at all ? This sort of defeats the  
> whole
> point of having CL on top of it: now it's here to define the classes,
> but performs no real job at all.

Well, to be frank, the application as a whole performs no real job at  
all; it just does a simple multiplication. The (trivial) work  
performed by the Currency Converter isn't the point of the example at  
all. The point is to show how the pieces of a Model-View-Controller  
application are implemented using the AppKit. The point of the Lisp  
version is to show how you can do exactly the same thing using Lisp  
instead of Objective-C as the implementation language.

> Which brings me to the last, more general question:
>
> if I want to perform the work in CL (here: to the math on single-float
> CL values), I'd have to go between CL and Objc types. How do you do  
> that

Well, in this example you are in fact performing the work in CL. The  
actual multiplication is performed in

(objc:defmethod (#/convertCurrency:atRate: :float)
                 ((self converter) (currency :float) (rate :float))
   (* currency rate))
...which is Common Lisp code. The bridge has thoughfully arranged for  
a Lisp form to be evaluated when the AppKit sends  
convertCurrency:atRate: to an instance of Converter. It also handles  
the conversions of the float values when they are transferred between  
Objective-C and Lisp code.

If you want to understand and control the gritty details of passing  
data back and forth across the bridge, you might want to look at:

http://www.openmcl.org/Doc/index.html#The-Foreign_002dFunction-Interface

If this reply omits information you wanted, or confuses more than it  
clarifies, don't hesitate to ask for more clarification.

--me




More information about the Openmcl-devel mailing list