/usr/share/lilypond/2.18.2/scm/parser-ly-from-scheme.scm is in lilypond-data 2.18.2-4.1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | ;;;; This file is part of LilyPond, the GNU music typesetter.
;;;;
;;;; Copyright (C) 2004--2012 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-public (read-lily-expression chr port)
"Read a lilypond music expression enclosed within @code{#@{} and @code{#@}}
from @var{port} and return the corresponding Scheme music expression.
@samp{$} and @samp{#} introduce immediate and normal Scheme forms."
(let* ((closures '())
(filename (port-filename port))
(line (port-line port))
(lily-string (call-with-output-string
(lambda (out)
(let ((copycat
(make-soft-port
(vector #f #f #f
(lambda ()
(let ((x (read-char port)))
(write-char x out)
x)) #f)
"r")))
(set-port-filename! copycat filename)
(do ((c (read-char port) (read-char port)))
((and (char=? c #\#)
(char=? (peek-char port) #\}))
;; we stop when #} is encountered
(read-char port))
(write-char c out)
;; a #scheme or $scheme expression
(if (or (char=? c #\#) (char=? c #\$))
(let* ((p (ftell out))
(expr
(begin
(set-port-line! copycat
(port-line port))
(set-port-column! copycat
(port-column port))
(if (char=? (peek-char port) #\@)
(read-char copycat))
(read copycat))))
;; kill unused lookahead, it has been
;; written out already
(drain-input 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)))))))))))
(define (embedded-lilypond parser lily-string filename line
closures location)
(let* ((clone (ly:parser-clone parser closures location))
(result (ly:parse-string-expression clone lily-string
filename line)))
(if (ly:parser-has-error? clone)
(ly:parser-error parser (_ "error in #{ ... #}")))
result))
(list embedded-lilypond
'parser lily-string filename line
(cons 'list (reverse! closures))
'location)))
(read-hash-extend #\{ read-lily-expression)
|