Hi REPLeffect,
This is interesting stuff, please let the ml know what you get to.
Now, this is already under the hood in Gambit so one way of getting this would be just to dig it out.
Also, I would guess that the way it's implemented there is CPU-inexpensive, so it'd be a good place to learn from. Just hunt around in _repl.scm or alike for any handling of the tab character?
Mikael
2012/10/7 REPLeffect repleffect@gmail.com
On Sat, Oct 6, 2012 at 10:21 PM, REPLeffect repleffect@gmail.com wrote:
What would it take to expose a procedure in the interpreter for completing symbols in the symbol table. What I mean is, I'd like a scheme procedure I could call with a string representing either a full or a partial symbol, and the procedure would give me back a list of the possible completions for currently defined symbols.
Essentially I want a procedure that does what the tab completion in the interpreter's REPL does.
I'm using the partially-implemented swank backend that James Long was working on a while back, and I found these procedures that Marc posted to the list back in March of '09:
(define (symbol-table->list st)
(define (symbol-chain s syms) (let loop ((s s) (syms syms)) (if (symbol? s) (loop (##vector-ref s 2) (cons s syms)) syms))) (let loop ((lst (vector->list st)) (syms '())) (if (pair? lst) (loop (cdr lst) (symbol-chain (car lst) syms)) (reverse syms))))
(define (interned-symbols) (symbol-table->list (##symbol-table)))
(pp (length (interned-symbols)))
(that was from this post:
https://mercure.iro.umontreal.ca/pipermail/gambit-list/2009-March/003308.htm...
)
From that I cobbled together a very inefficient hash-table-based tab
completion (especially inefficient because of duplicating the entire symbol table in a hash table, one key per symbol). I realize this is a complete kludge and wastes tremendous amounts of memory. I'd like to do it right and just query the symbol table itself, since the data is obviously already there.
I found the complete_word(), lineeditor_word_completion(), and visit_symbol() functions in os_tty.c, and I'm sure that the solution is to write a similar set of C functions to act as a scheme interface to do what I want. However, I suspect I don't understand the code well enough at this point to do that correctly.
I'd be willing to give it a shot if I thought I had a sufficient quantity of tips on how to get it done (I started to say 'pointers' on how to get it done, but I suspected that would only lead to a long string of programmer jokes that might derail this thread :-D ).
It seems to me that this would be a good thing to have available for any application that might embed Gambit and/or communicate with a process running the Gambit interpreter. I don't think the applicability would be in any way limited to slime/swank (though, admittedly, that is my primary motivation for having it).
REPLeffect _______________________________________________ Gambit-list mailing list Gambit-list@iro.umontreal.ca https://webmail.iro.umontreal.ca/mailman/listinfo/gambit-list
Sorry about that, no subject on the previous email. I thought Gmail warned you before sending without a subject, but it didn't warn me this time.
REPLeffect _______________________________________________ Gambit-list mailing list Gambit-list@iro.umontreal.ca https://webmail.iro.umontreal.ca/mailman/listinfo/gambit-list