[gambit-list] Problem with interactive development using remote REPL of iOS Sim.

Tatsuya Tsuda otabat at gmail.com
Wed Feb 27 04:03:17 EST 2013

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)
         ;(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.";

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];

    [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

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

2. Create a loadable library
gsc -cc-options "-arch i386 -x objective-c -isysroot
-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?

Tatsuya Tsuda
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.iro.umontreal.ca/pipermail/gambit-list/attachments/20130227/34971981/attachment.htm>

More information about the Gambit-list mailing list