]> git.donarmstrong.com Git - lilypond.git/commitdiff
Issue 4874/1: Don't overwrite pre-bound session variables
authorDavid Kastrup <dak@gnu.org>
Thu, 2 Jun 2016 12:07:02 +0000 (14:07 +0200)
committerDavid Kastrup <dak@gnu.org>
Thu, 9 Jun 2016 07:33:10 +0000 (09:33 +0200)
This is necessary in order to use session variables
in lily-imports.cc

scm/lily.scm

index ce3486cf3f4e70f9479fa6b4ac91e8a596c5a490..9b8afa63b57552be10e13a563e6302ebac822822 100644 (file)
       (ly:error (_ "call-after-session used after session start")))
   (add-hook! after-session-hook thunk #t))
 
+(define (make-session-variable name value)
+  (if (ly:undead? lilypond-declarations)
+      (ly:error (_ "define-session used after session start")))
+  (let ((var (module-make-local-var! (current-module) name)))
+    (if (variable-bound? var)
+        (ly:error (_ "symbol ~S redefined") name))
+    (variable-set! var value)
+    var))
+
 (defmacro-public define-session (name value)
   "This defines a variable @var{name} with the starting value
 @var{value} that is reinitialized at the start of each session.
@@ -108,22 +117,23 @@ to their front or replacing them altogether, not by modifying parts of
 them.  It is an error to call @code{define-session} after the first
 session has started."
   (define (add-session-variable name value)
-    (if (ly:undead? lilypond-declarations)
-        (ly:error (_ "define-session used after session start")))
-    (let ((var (make-variable value)))
-      (module-add! (current-module) name var)
-      (set! lilypond-declarations (cons var lilypond-declarations))))
+    (set! lilypond-declarations
+          (cons (make-session-variable name value) lilypond-declarations)))
   `(,add-session-variable ',name ,value))
 
 (defmacro-public define-session-public (name value)
   "Like @code{define-session}, but also exports @var{name} into parser modules."
   (define (add-session-variable name value)
-    (if (ly:undead? lilypond-declarations)
-        (ly:error (_ "define-session-public used after session start")))
-    (let ((var (make-variable value)))
-      (module-add! (current-module) name var)
-      (set! lilypond-exports (acons name var lilypond-exports))))
-  `(,add-session-variable ',name ,value))
+    (set! lilypond-exports
+          (acons name (make-session-variable name value) lilypond-exports)))
+  `(begin
+     ;; this is a bit icky: we place the variable right into every
+     ;; parser module so that both set! and define will affect the
+     ;; original variable in the (lily) module.  However, we _also_
+     ;; export it normally from (lily) for the sake of other modules
+     ;; not sharing the name space of the parser.
+     (,add-session-variable ',name ,value)
+     (export ,name)))
 
 (define (session-terminate)
   (if (ly:undead? lilypond-declarations)