reading list of symbols defined in top level
suppose I have test.scm: (define (foo ...) ...) (define (bar ...) ...) (define (yay ...) ...) (some-magical-funcion) --> '(bar foo yay) # is this possible? basically, I want to have some function I can call to get a list of all symbols defined in the current top level
Afficher les réponses par date
On 1-Feb-09, at 12:09 AM, lowly coder wrote:
suppose I have test.scm:
(define (foo ...) ...) (define (bar ...) ...) (define (yay ...) ...)
(some-magical-funcion) --> '(bar foo yay) # is this possible?
basically, I want to have some function I can call to get a list of all symbols defined in the current top level
Depends what you mean by "the current top level". Anyway, the code below may be close to what you want: (##namespace ("foo#")) (##include "~~lib/gambit#.scm") (define (id x) x) (define (square x) (* x x)) (##namespace ("")) (define (global-vars-in-namespace ns) (define (symbol-table->list st) (apply append (map (lambda (s) (let loop ((s s) (lst '())) (if (symbol? s) (loop (##vector-ref s 2) (cons s lst)) (reverse lst)))) (vector->list st)))) (define (procedure-in-namespace? s) (let ((len (string-length ns)) (str (symbol->string s))) (and (>= (string-length str) len) (equal? (substring str 0 len) ns) (let ((val (##global-var-ref (##make-global-var s)))) (procedure? val))))) (define (keep keep? lst) (cond ((null? lst) '()) ((keep? (car lst)) (cons (car lst) (keep keep? (cdr lst)))) (else (keep keep? (cdr lst))))) (keep procedure-in-namespace? (symbol-table->list (##symbol-table)))) (pp (global-vars-in-namespace "foo#")) ;; prints: (foo#square foo#id)
participants (2)
-
lowly coder -
Marc Feeley