(define (copy-string string) (let ((data (blob->u8vector (string->blob string)))) ((foreign-lambda* (c-pointer char) ((u8vector src) (int size)) "char *dest = malloc((size + 1) * sizeof(char)); memcpy(dest, src, size * sizeof(char)); dest[size] = '\\0'; C_return(dest);") data (u8vector-length data)))) (define completion-index 0) (define completion-candidates #("foo" "bar" "baz" "💩")) ; <- utf-8 test (define-external (readline_completer ((const c-string) prefix) (int state)) (c-pointer char) (when (zero? state) (set! completion-index 0)) ; initialization (if (< completion-index (vector-length completion-candidates)) (let ((candidate (vector-ref completion-candidates completion-index))) (set! completion-index (add1 completion-index)) (copy-string candidate)) #f)) (define (enable-completer!) ((foreign-lambda* void () "rl_completion_entry_function = readline_completer;"))) (define (disable-completer!) ((foreign-lambda* void () "rl_completion_entry_function = NULL;")))