Hi, I am a newbie of Gambit Scheme coming from Clojure. Currently I am trying to build an iOS app in Gambit. I have successfully done the following: 1. Built 4.6.6-devel git version (snapshot of two weeks ago) of Gambit using llvm-gcc 2. Built Gambit REPL using iOS SDK 6.1 by using both clang and llvm-gcc from Xcode. 3. Minimized the remote REPL part of Gambit REPL and created a simple app 3.1. Created a scheme file, init.scm, to register and change the text of the UILabel.
;; The whole init.scm (declare (standard-bindings) (extended-bindings) (block) (fixnum) ;(not safe) )
(c-define-type UILabel* (pointer "UILabel"))
(c-declare "#import <UIKit/UIKit.h>") (define current-label #f)
(c-define (register-label label) (UILabel*) void "register_label" "" (set! current-label label))
(define change-label-text (c-lambda ((pointer "UILabel")) void #<<c-code ___arg1.text = @"Text changed."; c-code ))
3.2. In Xcode, I defined a viewDidLoad method as below, which prints "Hello Wolrd" and then passes the label to the scheme function register_label().
// Part of VIewController.m - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib.
_label = [[UILabel alloc] init]; _label.text = @"Hello World"; [_label setLineBreakMode:UILineBreakModeWordWrap]; [_label setNumberOfLines:0]; _label.frame = CGRectMake(0, 225, 320, 30); _label.textAlignment = UITextAlignmentCenter; [self.view addSubview:_label];
_timer = nil; _queuedActions = [[NSMutableArray alloc] init];
gambit_setup(); register_label(_label); repl_server_start(); [self heartbeat_tick]; }
So far, I have successfully built this simple app. I can connect to the remote REPL of iOS Simulator from the Emacs Inferior Lisp, and even able to change the text of the label dynamically by doing like (change-label-text current-label).
Now it seems that I can develop iOS apps, but I want to go further with the interactive development using the REPL. What I want to do is like: 1. Redefine the change-label-text function by changing the text like "New text!"
2. Create a loadable library gsc -cc-options "-arch i386 -x objective-c -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.1.sdk -D__IPHONE_OS_VERSION_MIN_REQUIRED=40300" -ld-options "-framework CoreFoundation -framework Foundation -framework UIKit" lib/init.scm
3. Do below in REPL (define old-label current-label)
4. Load the loadable library init.o1 from the REPL
5. Do below in REPL (change-label-text old-label)
6. Then an error in Xcode and the app terminates. 2013-02-27 17:38:31.305 gambit-test[61410:11303] *** NSForwarding: warning: selector (0x87a6f44) for message 'setText:' does not match selector known to Objective C runtime (0xabb96d)-- abort 2013-02-27 17:38:31.306 gambit-test[61410:11303] -[UILabel setText:]: unrecognized selector sent to instance 0x8284a50 2013-02-27 17:38:31.306 gambit-test[61410:11303] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UILabel setText:]: unrecognized selector sent to instance 0x8284a50' *** First throw call stack: (0x21a4012 0x15e1e7e 0x222f4bd 0x2193bbc 0x219394e 0x87a6e07 0x44b0c0) libc++abi.dylib: terminate called throwing an exception
I can create and load a loadable library with no errors. It seems that something is missing. Does anyone know how to solve this kind of problem?
Thanks, Tatsuya Tsuda