From: David Kastrup Date: Thu, 24 Nov 2011 15:13:01 +0000 (+0100) Subject: Don't create closures for obvious constants in #{ ... #} X-Git-Tag: release/2.15.21-1~44 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=a06520dd711f070d1f6f69c6ea90bcb4bb19e2ab;p=lilypond.git Don't create closures for obvious constants in #{ ... #} --- 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)))