]> git.donarmstrong.com Git - lilypond.git/blobdiff - scm/parser-ly-from-scheme.scm
add vcs lines to debian/control
[lilypond.git] / scm / parser-ly-from-scheme.scm
index 79267499bd2a5a184af4ca7af4b89f56974a685e..b86392623fddbf3b27ed5a4550e57b4aef5ad528 100644 (file)
@@ -1,9 +1,20 @@
-;;;; ly-from-scheme.scm -- parsing LilyPond music expressions from scheme
+;;;; This file is part of LilyPond, the GNU music typesetter.
 ;;;;
-;;;;  source file of the GNU LilyPond music typesetter
-;;;; 
-;;;; (c) 2004--2005  Nicolas Sceaux  <nicolas.sceaux@free.fr>
+;;;; Copyright (C) 2004--2011  Nicolas Sceaux  <nicolas.sceaux@free.fr>
 ;;;;           Jan Nieuwenhuizen <janneke@gnu.org>
+;;;;
+;;;; LilyPond is free software: you can redistribute it and/or modify
+;;;; it under the terms of the GNU General Public License as published by
+;;;; the Free Software Foundation, either version 3 of the License, or
+;;;; (at your option) any later version.
+;;;;
+;;;; LilyPond is distributed in the hope that it will be useful,
+;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;;; GNU General Public License for more details.
+;;;;
+;;;; You should have received a copy of the GNU General Public License
+;;;; along with LilyPond.  If not, see <http://www.gnu.org/licenses/>.
 
 (define gen-lily-sym
   ;; Generate a lilyvartmpXX symbol, that may be (hopefully) unique.
       (set! var-idx (1+ var-idx))
       (string->symbol (format #f "lilyvartmp~a"
                               (list->string (map (lambda (chr)
-                                                   (integer->char (+ (char->integer #\a) (- (char->integer chr)
-                                                                                            (char->integer #\0)))))
+                                                   (integer->char (+ (char->integer #\a)
+                                                                     (- (char->integer chr)
+                                                                        (char->integer #\0)))))
                                                  (string->list (number->string var-idx)))))))))
 
-(define-public (ly:parse-string-result str parser)
-  "Parse `str', which is supposed to contain a music expression."
-  (let ((music-sym (gen-lily-sym)))
-    (ly:parser-parse-string
-     parser
-     (format #f "parseStringResult = { ~a }" str))
+(define-public (parse-string-result str parser)
+  "Parse @var{str}, which is supposed to contain a music expression."
 
-    (ly:parser-lookup parser 'parseStringResult)))
+  (ly:parser-parse-string
+   parser
+   (format #f "parseStringResult = \\notemode { ~a }" str))
+  (ly:parser-lookup parser 'parseStringResult))
 
 (define-public (read-lily-expression chr port)
-  "Read a #{ lily music expression #} from port and return
-the scheme music expression. The $ character may be used to introduce
-scheme forms, typically symbols. $$ may be used to simply write a `$'
-character."
+  "Read a lilypond music expression enclosed within @code{#@}} and @code{#@}}
+from @var{port} and return the corresponding Scheme music expression.
+The @samp{$} character may be used to introduce Scheme forms, typically
+symbols.  @code{$$} may be used to simply write a @samp{$} character itself."
   (let ((bindings '()))
 
     (define (create-binding! val)
       "Create a new symbol, bind it to `val' and return it."
       (let ((tmp-symbol (gen-lily-sym)))
-
         (set! bindings (cons (cons tmp-symbol val) bindings))
         tmp-symbol))
     
@@ -55,42 +65,34 @@ character."
              (cons (create-binding! (cadr form)) (remove-dollars! (cddr form))))
             (else ;; (something ...)
              (cons (remove-dollars! (car form)) (remove-dollars! (cdr form))))))
-    (let*
-       ((lily-string (call-with-output-string
+    
+    (let ((lily-string (call-with-output-string
                         (lambda (out)
                           (do ((c (read-char port) (read-char port)))
-                             ((and (char=? c #\#)
-                                   (char=? (peek-char port) #\})) ;; we stop when #} is encoutered
-                              (read-char port))
-                           (cond
-                            ;; a $form expression
-                            ((and (char=? c #\$) (not (char=? (peek-char port) #\$)))
-                             (format out "\\~a" (create-binding! (read port))))
-                            ;; just a $ character
-                            ((and (char=? c #\$) (char=? (peek-char port) #\$))
-                            ;; pop the second $
-                             (display (read-char port) out))
-                            ;; a #scheme expression
-                            ((char=? c #\#)
-                             (let ((expr (read port)))
-                               (format out "#~s" (if (eq? '$ expr)
-                                                     (create-binding! (read port))
-                                                     (remove-dollars! expr)))))
-                            ;; other caracters
-                            (else
-                             (display c out)))))))
-
-         (result
-          `(let ((parser-clone (ly:clone-parser parser)))
-             ,@(map (lambda (binding)
-                      `(ly:parser-define! parser-clone ',(car binding) ,(cdr binding)))
-                    (reverse bindings))
-             (ly:parse-string-result ,lily-string parser-clone))
-         ))
-
-      
-            
-      result
-      )))
+                              ((and (char=? c #\#)
+                                    (char=? (peek-char port) #\})) ;; we stop when #} is encoutered
+                               (read-char port))
+                            (cond
+                             ;; a $form expression
+                             ((and (char=? c #\$) (not (char=? (peek-char port) #\$)))
+                              (format out "\\~a" (create-binding! (read port))))
+                             ;; just a $ character
+                             ((and (char=? c #\$) (char=? (peek-char port) #\$))
+                              ;; pop the second $
+                              (display (read-char port) out))
+                             ;; a #scheme expression
+                             ((char=? c #\#)
+                              (let ((expr (read port)))
+                                (format out "#~s" (if (eq? '$ expr)
+                                                      (create-binding! (read port))
+                                                      (remove-dollars! expr)))))
+                             ;; other caracters
+                             (else
+                              (display c out))))))))
+      `(let ((parser-clone (ly:parser-clone parser)))
+         ,@(map (lambda (binding)
+                  `(ly:parser-define! parser-clone ',(car binding) ,(cdr binding)))
+                (reverse bindings))
+         (parse-string-result ,lily-string parser-clone)))))
 
 (read-hash-extend #\{ read-lily-expression)