1 (define (all-environment-exports environment prefix)
3 (append (filter (lambda (identifier)
4 (if (string=? prefix "")
6 (string-contains identifier prefix)))
7 (map symbol->string (env-exports environment)))
8 (all-environment-exports (env-parent environment) prefix))
11 (define (geiser:completions prefix . rest)
13 (sort (all-environment-exports (current-environment) prefix)
16 (define (write-to-string form)
17 (let ((out (open-output-string)))
19 (get-output-string out)))
21 (define (geiser:eval module form . rest)
23 (let ((output (open-output-string))
25 (let ((mod (module-env (find-module module))))
28 (write `((result ,(write-to-string result))
29 (output . ,(get-output-string output))))
32 (define (geiser:module-completions prefix . rest)
33 ;; (available-modules) walks the directory tree and is too slow
34 (let ((modules (map car *modules*)))
37 (filter (lambda (module)
38 (if (string=? "" prefix)
40 (string-contains prefix (write-to-string module))))
43 (define (procedure-arglist id fun)
44 (let ((arglist (lambda-params (procedure-analysis fun))))
46 (let loop ((arglist arglist)
50 (cond ((null? arglist)
51 `(,id ("args" (("required" ,@(reverse required))
52 ("optional" ,@(reverse optional))
54 ("module" ,(let ((mod (containing-module fun))) (if mod (car mod) #f)))))))
59 (cons "..." (cons arglist optional))))
64 (if optionals? required (cons (car arglist) required))
65 (if optionals? (cons (car arglist) optional) optional)))))
68 (define (geiser:operator-arglist id)
69 (let ((binding (eval id)))
70 (cond ((procedure? binding)
73 (procedure-arglist id binding)))
77 (define (geiser:autodoc ids . rest)
79 (cond ((null? ids) '())
81 (geiser:autodoc (list ids)))
82 ((not (symbol? (car ids)))
83 (geiser:autodoc (cdr ids)))
86 (geiser:operator-arglist id))
89 (define (geiser:no-values)
92 (define (geiser:newline)