mkdir CLICalc
cd CLICalc
mulle-sde init -m foundation/objc-developer executable
This takes more or less forever.
… Still going. OK, finally done. I hate to think it's gonna do that every new project? Or whenever it updates?
Anyway, bbedit .
(fuck Xcode), and add at the bottom of import.h
and import-private.h
:
#import <Foundation/Foundation.h>
Make src/main.m
useful:
// main.m
#import "import-private.h"
#import "CLICalc.h"
int main(int argc, char *argv[]) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
CLICalc *calc = [[CLICalc alloc] init];
[calc push:42.0];
[calc push:69.0];
double a = [calc pop];
double b = [calc pop];
NSLog(@"a=%f, b=%f", a, b);
[pool release];
return 0;
}
Create an Objective-C class, src/CLICalc.h
:
// CLICalc.h
#import "import-private.h"
@interface CLICalc : NSObject
@property (retain) NSMutableArray *stack;
- (void)push:(double)n;
- (double)pop;
@end
and src/CLICalc.m
:
// CLICalc.m
#import "CLICalc.h"
@implementation CLICalc
@synthesize stack = _stack;
- (id)init {
self = [super init];
_stack = [[NSMutableArray alloc] init];
return self;
}
- (void)dealloc {
NSLog(@"CLICalc dealloc");
[_stack release];
[super dealloc];
}
- (void)push:(double)n {
[_stack addObject:@(n)];
}
- (double)pop {
if ( ! [_stack count]) {
// ERROR: stack underflow
return 0.0;
}
double n = [[_stack lastObject] doubleValue];
[_stack removeLastObject];
return n;
}
@end
Doing that without a template was a little hard on the old memory, and I had to use DDG to look up some method names without autocompletion. But I'm pretty sure that's fine.
In mulle-ide, type update
to add the new class to cmake: If you look in cmake/_Sources.cmake you should now see CLICalc.m
listed.
Now craft
to compile. You'll get a spew of crap, but hopefully no errors.
I am getting this, which I can't resolve:
/Users/mdh/Code/CodeMac/CLICalc/src/main.m:21:55: warning: 'NSAutoreleasePool'
may not respond to 'init'
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
~~~~~~~~~~~~~~~~~~~~~~~~~ ^
1 warning generated.
But NSAutoreleasePool certainly has init, and it seems to not die?
% ./build/Debug/CLICalc
a=69.000000, b=42.000000
Hooray!
Yeah, this isn't amazing. Except: It's supposedly portable now. I can maybe rebuild this on Linux, or Windows? I dunno.
This is almost classic Objective-C, slightly enhanced from 1.0: We didn't have property/synthesize, or nice object wrappers like @() when I were a lad. I typed so many [NSNumber numberWithInteger:n]. So get used to the retain/release/autorelease dance. There's no dot-syntax for property access, type them [] like old-school. But hey, it's a proper compiled language with a nice object system and no GC pausing.
I tried importing Cocoa and got a ludicrous spew of errors, so Mac GUI is gonna be a challenge. But I could import SDL and use that for portable UI, since Objective-C is just C.
Sweet. I'll finish up the calculator's parser in a bit, but then see about doing something useful in it.