emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[nongnu] elpa/geiser-guile 441cc2a 037/284: Refactoring: local bindings


From: Philip Kaludercic
Subject: [nongnu] elpa/geiser-guile 441cc2a 037/284: Refactoring: local bindings discovery moved to schemeland.
Date: Sun, 1 Aug 2021 18:29:11 -0400 (EDT)

branch: elpa/geiser-guile
commit 441cc2a9ba563c55ec3dd6ed138f99f62464d5ea
Author: Jose Antonio Ortega Ruiz <jao@gnu.org>
Commit: Jose Antonio Ortega Ruiz <jao@gnu.org>

    Refactoring: local bindings discovery moved to schemeland.
---
 geiser/introspection.scm | 31 +++++++++++++++++++++++++++----
 1 file changed, 27 insertions(+), 4 deletions(-)

diff --git a/geiser/introspection.scm b/geiser/introspection.scm
index 7e468e7..fd6784d 100644
--- a/geiser/introspection.scm
+++ b/geiser/introspection.scm
@@ -149,10 +149,33 @@ The alist keys that are currently defined are `required', 
`optional',
              ,@(if rest (list (cons 'rest 'rest)) '())))))
    (else #f)))
 
-(define (completions prefix)
-  (sort! (map symbol->string
-              (apropos-internal (string-append "^" prefix)))
-         string<?))
+(define (completions prefix . context)
+  (let ((context (and (not (null? context)) (car context)))
+        (prefix (string-append "^" (regexp-quote prefix))))
+    (append (filter (lambda (s) (string-match prefix s))
+                    (map symbol->string (local-bindings context)))
+            (sort! (map symbol->string (apropos-internal prefix)) string<?))))
+
+(define (local-bindings form)
+  (define (body f) (if (> (length f) 2) (cddr f) '()))
+  (define (decl-list d)
+    (let loop ((d d) (s '()))
+      (cond ((null? d) s)
+            ((symbol? d) (cons d s))
+            (else (loop (cdr d) (cons (car d) s))))))
+  (let loop ((form form) (bindings '()))
+    (cond ((not (pair? form)) bindings)
+          ((list? (car form))
+           (loop (cdr form) (append (local-bindings (car form)) bindings)))
+          ((and (list? form) (< (length form) 2)) bindings)
+          ((memq (car form) '(define define* lambda))
+           (loop (body form) (append (decl-list (cadr form)) bindings)))
+          ((and (memq (car form) '(let let* letrec letrec*))
+                (list? (cadr form)))
+           (loop (body form) (append (map car (cadr form)) bindings)))
+          ((and (eq? 'let (car form)) (symbol? (cadr form)))
+           (loop (cons 'let (body form)) (cons (cadr form) bindings)))
+          (else (loop (cdr form) bindings)))))
 
 (define (module-location name)
   (make-location (module-filename name) #f))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]