From a06520dd711f070d1f6f69c6ea90bcb4bb19e2ab Mon Sep 17 00:00:00 2001 From: David Kastrup Date: Thu, 24 Nov 2011 16:13:01 +0100 Subject: [PATCH] Don't create closures for obvious constants in #{ ... #} --- scm/parser-ly-from-scheme.scm | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/scm/parser-ly-from-scheme.scm b/scm/parser-ly-from-scheme.scm index f407a3dff0..7e1757123f 100644 --- a/scm/parser-ly-from-scheme.scm +++ b/scm/parser-ly-from-scheme.scm @@ -41,15 +41,20 @@ from @var{port} and return the corresponding Scheme music expression. (write-char c out) ;; a #scheme or $scheme expression (if (or (char=? c #\#) (char=? c #\$)) - (let ((p (ftell out))) - (set! closures - (cons (cons p (read copycat)) - closures)))))))))) + (let* ((p (ftell out)) + (expr (read copycat))) + ;; only put symbols and non-quote + ;; lists into closures -- constants + ;; don't need lexical environments + ;; for evaluation. + (if (or (symbol? expr) + (and (pair? expr) + (not (eq? 'quote (car expr))))) + (set! closures + (cons `(cons ,p (lambda () ,expr)) + closures))))))))))) `(let* ((clone - (ly:parser-clone parser (list ,@(map (lambda (c) - `(cons ,(car c) - (lambda () ,(cdr c)))) - (reverse! closures))))) + (ly:parser-clone parser (list ,@closures))) (result (ly:parse-string-expression clone ,lily-string ,filename ,line))) -- 2.39.5