[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[nongnu] elpa/geiser-chicken d9e6778 063/102: Remove memoization
From: |
Philip Kaludercic |
Subject: |
[nongnu] elpa/geiser-chicken d9e6778 063/102: Remove memoization |
Date: |
Sun, 1 Aug 2021 18:26:56 -0400 (EDT) |
branch: elpa/geiser-chicken
commit d9e6778cfbb4202e4912a0575610871195703ddd
Author: Dan Leslie <dan@ironoxide.ca>
Commit: Dan Leslie <dan@ironoxide.ca>
Remove memoization
It now _slows_ performance rather than improves it. Removing it speeds
up the issue described in jaor/geiser#174
---
geiser/emacs.scm | 210 ++++++++++++++++++++++++-------------------------------
1 file changed, 91 insertions(+), 119 deletions(-)
diff --git a/geiser/emacs.scm b/geiser/emacs.scm
index b6af65e..908f768 100644
--- a/geiser/emacs.scm
+++ b/geiser/emacs.scm
@@ -221,34 +221,14 @@
(define module-name ##sys#module-name)
(define (list-modules) (map car ##sys#module-table))
- (define memo (make-parameter (make-hash-table)))
- (define symbol-memo (make-parameter (make-hash-table)))
- (define (clear-memo) (hash-table-clear! (memo)))
- (define (memoize/tbl table tag thunk)
- (if (hash-table-exists? table tag)
- (begin
- (write-to-log '[[Cache Hit]])
- (hash-table-ref table tag))
- (fluid-let ((memoize/tbl (lambda (table tag thunk) (thunk))))
- (write-to-log '[[Cache Miss]])
- (hash-table-set! table tag (thunk))
-
- (hash-table-ref table tag))))
-
- (define (memoize tag thunk)
- (memoize/tbl (memo) tag thunk))
-
(define empty-symbol (string->symbol ""))
(define (symbol-information-list partial-string)
- (memoize
- `(symbol-information-list ,partial-string)
- (lambda ()
- (map (lambda (lst)
- (let* ((module (if (eq? empty-symbol (caar lst)) #f (caar lst)))
- (name (cdar lst)))
- (append (list name module) (cdr lst))))
- (apropos-information-list partial-string #:macros? #t)))))
+ (map (lambda (lst)
+ (let* ((module (if (eq? empty-symbol (caar lst)) #f (caar lst)))
+ (name (cdar lst)))
+ (append (list name module) (cdr lst))))
+ (apropos-information-list partial-string #:macros? #t)))
(define debug-log (make-parameter #f))
(define (write-to-log form)
@@ -395,77 +375,71 @@
(else (eval* (->string str)))))
(define (fmt node)
- (memoize
- `(fmt ,node)
- (lambda ()
- (let* ((mod (cadr node))
- (sym (car node))
- (rest (cddr node))
- (type (if (or (list? rest) (pair? rest)) (car rest) rest))
- (mod-list (make-module-list sym mod)))
- (cond
- ((equal? 'macro type)
- `(,sym ("args" (("required" <macro>)
- ("optional" ...)
- ("key")))
- ("module" ,@mod-list)))
- ((or (equal? 'variable type)
- (equal? 'constant type))
- (if (not mod)
- `(,sym ("value" . ,(eval* sym)))
- (let* ((original-module (current-module))
- (desired-module (find-module mod))
- (value (begin (switch-module desired-module)
- (eval* sym))))
- (switch-module original-module)
- `(,sym ("value" . ,value)
- ("module" ,@mod-list)))))
- (else
- (let ((reqs '())
- (opts '())
- (keys '())
- (args (if (or (list? rest) (pair? rest)) (cdr rest) '())))
-
- (define (clean-arg arg)
- (let ((s (->string arg)))
- (read* (substring/shared s 0 (add1 (string-skip-right s
char-set:digit))))))
-
- (define (collect-args args #!key (reqs? #t) (opts? #f) (keys? #f))
- (when (not (null? args))
- (cond
- ((or (pair? args) (list? args))
- (cond
- ((eq? '#!key (car args))
- (collect-args (cdr args) reqs?: #f opts?: #f keys?: #t))
- ((eq? '#!optional (car args))
- (collect-args (cdr args) reqs?: #f opts?: #t keys?: #f))
- (else
- (begin
- (cond
- (reqs?
- (set! reqs (append reqs (list (clean-arg (car
args))))))
- (opts?
- (set! opts (append opts (list (cons (clean-arg (caar
args)) (cdar args))))))
- (keys?
- (set! keys (append keys (list (cons (clean-arg (caar
args)) (cdar args)))))))
- (collect-args (cdr args))))))
- (else
- (set! opts (list (clean-arg args) '...))))))
-
- (collect-args args)
-
- `(,sym ("args" (("required" ,@reqs)
- ("optional" ,@opts)
- ("key" ,@keys)))
- ("module" ,@mod-list)))))))))
+ (let* ((mod (cadr node))
+ (sym (car node))
+ (rest (cddr node))
+ (type (if (or (list? rest) (pair? rest)) (car rest) rest))
+ (mod-list (make-module-list sym mod)))
+ (cond
+ ((equal? 'macro type)
+ `(,sym ("args" (("required" <macro>)
+ ("optional" ...)
+ ("key")))
+ ("module" ,@mod-list)))
+ ((or (equal? 'variable type)
+ (equal? 'constant type))
+ (if (not mod)
+ `(,sym ("value" . ,(eval* sym)))
+ (let* ((original-module (current-module))
+ (desired-module (find-module mod))
+ (value (begin (switch-module desired-module)
+ (eval* sym))))
+ (switch-module original-module)
+ `(,sym ("value" . ,value)
+ ("module" ,@mod-list)))))
+ (else
+ (let ((reqs '())
+ (opts '())
+ (keys '())
+ (args (if (or (list? rest) (pair? rest)) (cdr rest) '())))
+
+ (define (clean-arg arg)
+ (let ((s (->string arg)))
+ (read* (substring/shared s 0 (add1 (string-skip-right s
char-set:digit))))))
+
+ (define (collect-args args #!key (reqs? #t) (opts? #f) (keys? #f))
+ (when (not (null? args))
+ (cond
+ ((or (pair? args) (list? args))
+ (cond
+ ((eq? '#!key (car args))
+ (collect-args (cdr args) reqs?: #f opts?: #f keys?: #t))
+ ((eq? '#!optional (car args))
+ (collect-args (cdr args) reqs?: #f opts?: #t keys?: #f))
+ (else
+ (begin
+ (cond
+ (reqs?
+ (set! reqs (append reqs (list (clean-arg (car args))))))
+ (opts?
+ (set! opts (append opts (list (cons (clean-arg (caar
args)) (cdar args))))))
+ (keys?
+ (set! keys (append keys (list (cons (clean-arg (caar
args)) (cdar args)))))))
+ (collect-args (cdr args))))))
+ (else
+ (set! opts (list (clean-arg args) '...))))))
+
+ (collect-args args)
+
+ `(,sym ("args" (("required" ,@reqs)
+ ("optional" ,@opts)
+ ("key" ,@keys)))
+ ("module" ,@mod-list)))))))
;; Builds a signature list from an identifier
(define (find-signatures sym)
- (memoize
- `(find-signatures ,sym)
- (lambda ()
- (let ((result (symbol-information-list sym)))
- (map fmt result)))))
+ (let ((result (symbol-information-list sym)))
+ (map fmt result)))
;; Builds the documentation from Chicken Doc for a specific symbol
(define (make-doc symbol #!optional (filter-for-type #f))
@@ -488,29 +462,29 @@
;; Basically all non-core functions pass through geiser-eval
- (define (geiser-eval module form . rest)
- (define (form-has-safe-geiser? form)
- (any (cut eq? (car form) <>)
- '(geiser-no-values geiser-newline geiser-completions
- geiser-autodoc geiser-object-signature geiser-symbol-location
- geiser-symbol-documentation geiser-module-exports
- geiser-module-path geiser-module-location
- geiser-module-completions geiser-chicken-use-debug-log)))
-
- (define (form-has-any-geiser? form)
- (string-has-prefix? (->string (car form)) "geiser-"))
-
- (define (form-defines-any-module? form)
- (or
- ;; Geiser seems to send buffers as (begin ..buffer contents..)
- (and (eq? (car form) 'begin)
- (form-defines-any-module? (cadr form)))
- (any (cut eq? (car form) <>)
- '(module define-library))))
-
- (define (module-matches-defined-module? module)
- (any (cut eq? module <>) (list-modules)))
+ (define (form-has-safe-geiser? form)
+ (any (cut eq? (car form) <>)
+ '(geiser-no-values geiser-newline geiser-completions
+ geiser-autodoc geiser-object-signature geiser-symbol-location
+ geiser-symbol-documentation geiser-module-exports
+ geiser-module-path geiser-module-location
+ geiser-module-completions geiser-chicken-use-debug-log)))
+ (define (form-has-any-geiser? form)
+ (string-has-prefix? (->string (car form)) "geiser-"))
+
+ (define (form-defines-any-module? form)
+ (or
+ ;; Geiser seems to send buffers as (begin ..buffer contents..)
+ (and (eq? (car form) 'begin)
+ (form-defines-any-module? (cadr form)))
+ (any (cut eq? (car form) <>)
+ '(module define-library))))
+
+ (define (module-matches-defined-module? module)
+ (any (cut eq? module <>) (list-modules)))
+
+ (define (geiser-eval module form . rest)
(when (and module (not (symbol? module)))
(error "Module should be a symbol"))
@@ -527,10 +501,8 @@
(write-to-log form)
(if is-safe-geiser?
- (call-with-result #f (lambda () (memoize form thunk)))
- (begin
- (clear-memo)
- (call-with-result host-module thunk)))))
+ (call-with-result #f thunk)
+ (call-with-result host-module thunk))))
;; Load a file
- [nongnu] elpa/geiser-chicken 67a7bd5 015/102: Merge remote-tracking branch 'dleslie/proper-windows-loading', (continued)
- [nongnu] elpa/geiser-chicken 67a7bd5 015/102: Merge remote-tracking branch 'dleslie/proper-windows-loading', Philip Kaludercic, 2021/08/01
- [nongnu] elpa/geiser-chicken c77a8d3 021/102: Adds the ability to have sub-word delimiters, Philip Kaludercic, 2021/08/01
- [nongnu] elpa/geiser-chicken 39e128e 030/102: Converts toplevel methods to prefixed methods, Philip Kaludercic, 2021/08/01
- [nongnu] elpa/geiser-chicken 752b9b2 035/102: Minor improvements, Philip Kaludercic, 2021/08/01
- [nongnu] elpa/geiser-chicken 58ecefe 043/102: Completions didn't work after first symbol in sexp, Philip Kaludercic, 2021/08/01
- [nongnu] elpa/geiser-chicken fb5baa4 042/102: No longer show arguments as strings., Philip Kaludercic, 2021/08/01
- [nongnu] elpa/geiser-chicken 78ce429 055/102: Adds required modules to binary parameters, Philip Kaludercic, 2021/08/01
- [nongnu] elpa/geiser-chicken b779e7e 057/102: Allows Chicken to limit the number of symbols provided to Geiser, Philip Kaludercic, 2021/08/01
- [nongnu] elpa/geiser-chicken 4e5c66b 060/102: Support Chicken Scheme apropos =>2.3.0, Philip Kaludercic, 2021/08/01
- [nongnu] elpa/geiser-chicken ff59903 061/102: Improvements to Chicken completion speed, Philip Kaludercic, 2021/08/01
- [nongnu] elpa/geiser-chicken d9e6778 063/102: Remove memoization,
Philip Kaludercic <=
- [nongnu] elpa/geiser-chicken 3c77b8b 064/102: Make geiser-chicken-required-modules customizable (#233), Philip Kaludercic, 2021/08/01
- [nongnu] elpa/geiser-chicken fb9ddca 066/102: Chicken 5 works with Geiser, many features removed, Philip Kaludercic, 2021/08/01
- [nongnu] elpa/geiser-chicken 44a571f 068/102: Removed more unused code, speeding things up., Philip Kaludercic, 2021/08/01
- [nongnu] elpa/geiser-chicken aecb324 067/102: Version check is 4.x compatible again, Philip Kaludercic, 2021/08/01
- [nongnu] elpa/geiser-chicken 50ddd07 070/102: Much faster completions for Chicken 5; less errors in the log., Philip Kaludercic, 2021/08/01
- [nongnu] elpa/geiser-chicken 12c74dc 073/102: Use string-equal instead of equalp, Philip Kaludercic, 2021/08/01
- [nongnu] elpa/geiser-chicken 481fa76 077/102: More accurate Chicken completions, inspired by breadline, Philip Kaludercic, 2021/08/01
- [nongnu] elpa/geiser-chicken cc768c6 079/102: whitespace, Philip Kaludercic, 2021/08/01
- [nongnu] elpa/geiser-chicken eb06d1e 082/102: Fix indentation, Philip Kaludercic, 2021/08/01
- [nongnu] elpa/geiser-chicken 30957df 083/102: Fix indentation, Philip Kaludercic, 2021/08/01