X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=scm%2Flily.scm;h=f870cb6254483fd7b681d991a64a22c72d5ebfc3;hb=ffe9abeff111a8342ab82e6f203aa405336e010b;hp=f6784594269a6c8aa9124a6521a0ade8f353fe32;hpb=f23a0d9dcda87d3f6f072fba3addeae941cce4aa;p=lilypond.git diff --git a/scm/lily.scm b/scm/lily.scm index f678459426..f870cb6254 100644 --- a/scm/lily.scm +++ b/scm/lily.scm @@ -8,41 +8,49 @@ ;;; Library functions +(if (defined? 'set-debug-cell-accesses!) + (set-debug-cell-accesses! #f)) + +;(set-debug-cell-accesses! 5000) + (use-modules (ice-9 regex) (ice-9 safe) (oop goops) (srfi srfi-1) ; lists (srfi srfi-13)) ; strings -(define-public safe-module (make-safe-module)) + +; my display (define-public (myd k v) (display k) (display ": ") (display v) (display ", ")) +(define-public (print . args) + (apply format (cons (current-output-port) args))) + + ;;; General settings ;;; debugging evaluator is slower. This should ;;; have a more sensible default. - (if (ly:get-option 'verbose) (begin (debug-enable 'debug) (debug-enable 'backtrace) - (read-enable 'positions) )) + (read-enable 'positions))) - -(define-public (line-column-location line col file) +(define-public (line-column-location file line col) "Print an input location, including column number ." (string-append (number->string line) ":" - (number->string col) " " file) - ) + (number->string col) " " file)) -(define-public (line-location line col file) +(define-public (line-location file line col) "Print an input location, without column number ." - (string-append (number->string line) " " file) - ) + (string-append (number->string line) " " file)) (define-public point-and-click #f) +(define-public parser #f) + (define-public (lilypond-version) (string-join (map (lambda (x) (if (symbol? x) @@ -57,7 +65,10 @@ (define ifdef "First run this through cpp.") (define ifndef "First run this through cpp.") - +;; gettext wrapper for guile < 1.7.2 +(if (defined? 'gettext) + (define-public _ gettext) + (define-public _ ly:gettext)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -89,35 +100,46 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; lily specific variables. + (define-public default-script-alist '()) -(define-public security-paranoia #f) -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; Unassorted utility functions. +;; parser stuff. +(define-public (print-music-as-book parser music) + (let* ((head (ly:parser-lookup parser '$globalheader)) + (book (ly:make-book (ly:parser-lookup parser $defaultpaper) + head score))) + (ly:parser-print-book parser book))) +(define-public (print-score-as-book parser score) + (let* + ((head (ly:parser-lookup parser '$globalheader)) + (book (ly:make-book (ly:parser-lookup parser $defaultpaper) + head score))) + (ly:parser-print-book parser book))) + +(define-public (print-score parser score) + (let* ((head (ly:parser-lookup parser '$globalheader)) + (book (ly:make-book (ly:parser-lookup parser $defaultpaper) + head score))) + (ly:parser-print-score parser book))) + +(define-public (collect-scores-for-book parser score) + (let* + ((oldval (ly:parser-lookup parser 'toplevel-scores))) + (ly:parser-define parser 'toplevel-scores (cons score oldval)) + )) -;;;;;;;;;;;;;;;; -; alist -(define (uniqued-alist alist acc) - (if (null? alist) acc - (if (assoc (caar alist) acc) - (uniqued-alist (cdr alist) acc) - (uniqued-alist (cdr alist) (cons (car alist) acc))))) +(define-public (collect-music-for-book parser music) + (collect-scores-for-book parser (ly:music-scorify music parser))) -(define (assoc-get key alist) - "Return value if KEY in ALIST, else #f." - (let ((entry (assoc key alist))) - (if entry (cdr entry) #f))) -(define (assoc-get-default key alist default) - "Return value if KEY in ALIST, else DEFAULT." - (let ((entry (assoc key alist))) - (if entry (cdr entry) default))) - +;;;;;;;;;;;;;;;; +; alist +(define-public assoc-get ly:assoc-get) -(define-public (uniqued-alist alist acc) +(define-public (uniqued-alist alist acc) (if (null? alist) acc (if (assoc (caar alist) acc) (uniqued-alist (cdr alist) acc) @@ -127,9 +149,7 @@ (stringstring (car x)) (symbol->string (car y)))) - - -(define (chain-assoc x alist-list) +(define-public (chain-assoc x alist-list) (if (null? alist-list) #f (let* ((handle (assoc x (car alist-list)))) @@ -137,14 +157,20 @@ handle (chain-assoc x (cdr alist-list)))))) -(define (chain-assoc-get x alist-list default) - (if (null? alist-list) - default - (let* ((handle (assoc x (car alist-list)))) - (if (pair? handle) - (cdr handle) - (chain-assoc-get x (cdr alist-list) default))))) +(define-public (chain-assoc-get x alist-list . default) + "Return ALIST entry for X. Return DEFAULT (optional, else #f) if not +found." + + (define (helper x alist-list default) + (if (null? alist-list) + default + (let* ((handle (assoc x (car alist-list)))) + (if (pair? handle) + (cdr handle) + (helper x (cdr alist-list) default))))) + (helper x alist-list + (if (pair? default) (car default) #f))) (define (map-alist-vals func list) "map FUNC over the vals of LIST, leaving the keys." @@ -298,7 +324,8 @@ L1 is copied, L2 not. "Length of the number-pair X, when an interval" (max 0 (- (cdr x) (car x))) ) - +(define-public interval-start car) +(define-public interval-end cdr) (define (other-axis a) (remainder (+ a 1) 2)) @@ -314,7 +341,8 @@ L1 is copied, L2 not. (define-public (write-me message x) - "Return X. Display MESSAGE and write X. Handy for debugging, possibly turned off." + "Return X. Display MESSAGE and write X. Handy for debugging, +possibly turned off." (display message) (write x) (newline) x) ;; x) @@ -351,10 +379,7 @@ L1 is copied, L2 not. (not (= l r))) (define-public (ly:load x) - (let* ( - (fn (%search-load-path x)) - - ) + (let* ((fn (%search-load-path x))) (if (ly:get-option 'verbose) (format (current-error-port) "[~A]" fn)) (primitive-load fn))) @@ -362,52 +387,72 @@ L1 is copied, L2 not. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; output -(use-modules (scm output-tex) - (scm output-ps) - (scm output-sketch) - (scm output-sodipodi) - (scm output-pdftex) - ) - -(define output-alist - `( - ("tex" . ("TeX output. The default output form." ,tex-output-expression)) - ("ps" . ("Direct postscript. Requires setting GS_LIB and GS_FONTPATH" ,ps-output-expression)) - ("scm" . ("Scheme dump: debug scheme molecule expressions" ,write)) - ("sketch" . ("Bare bones Sketch output." ,sketch-output-expression)) - ("sodipodi" . ("Bare bones Sodipodi output." ,sodipodi-output-expression)) - ("pdftex" . ("PDFTeX output. Was last seen nonfunctioning." ,pdftex-output-expression)) - )) + +;;(define-public (output-framework) (write "hello\n")) + +(define output-tex-module + (make-module 1021 (list (resolve-interface '(scm output-tex))))) +(define output-ps-module + (make-module 1021 (list (resolve-interface '(scm output-ps))))) + +(define-public (ps-output-expression expr port) + (display (eval expr output-ps-module) port)) + +;; TODO: generate this list by registering the stencil expressions +;; stencil expressions should have docstrings. +(define-public (ly:all-stencil-expressions) + "Return list of stencil expressions." + '( + beam + bezier-sandwich + blank + bracket + char + dashed-line + dashed-slur + dot + draw-line + ez-ball + filledbox + horizontal-line + polygon + repeat-slash + round-filled-box + symmetric-x-triangle + text + tuplet + white-dot + white-text + zigzag-line + )) -(define (document-format-dumpers) - (map - (lambda (x) - (display (string-append (pad-string-to 5 (car x)) (cadr x) "\n")) - output-alist) - )) - -(define-public (find-dumper format ) - (let* - ((d (assoc format output-alist))) - - (if (pair? d) - (caddr d) - (scm-error "Could not find dumper for format ~s" format)) +;; TODO: +;; - generate this list by registering the output-backend-commands +;; output-backend-commands should have docstrings. +;; - remove hard copies in output-ps output-tex +(define-public (ly:all-output-backend-commands) + "Return list of output backend commands." + '( + comment + grob-cause + no-origin + placebox + unknown )) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; other files. -(map ly:load - ; load-from-path +(for-each ly:load + ;; load-from-path '("define-music-types.scm" "output-lib.scm" "c++.scm" "chord-ignatzek-names.scm" "chord-entry.scm" "chord-generic-names.scm" - "molecule.scm" + "stencil.scm" "new-markup.scm" "bass-figure.scm" "music-functions.scm" @@ -415,26 +460,32 @@ L1 is copied, L2 not. "define-music-properties.scm" "auto-beam.scm" "chord-name.scm" + + "ly-from-scheme.scm" - "define-translator-properties.scm" + "define-context-properties.scm" "translation-functions.scm" "script.scm" "midi.scm" - "beam.scm" "clef.scm" "slur.scm" "font.scm" + "encoding.scm" + "fret-diagrams.scm" + "define-markup-commands.scm" "define-grob-properties.scm" "define-grobs.scm" "define-grob-interfaces.scm" - + "page-layout.scm" + "titling.scm" + "paper.scm" - )) - - + ; last: + "safe-lily.scm" + )) (set! type-p-name-alist @@ -443,6 +494,7 @@ L1 is copied, L2 not. (,boolean? . "boolean") (,char? . "char") (,grob-list? . "list of grobs") + (,hash-table? . "hash table") (,input-port? . "input port") (,integer? . "integer") (,list? . "list") @@ -450,16 +502,16 @@ L1 is copied, L2 not. (,ly:dimension? . "dimension, in staff space") (,ly:dir? . "direction") (,ly:duration? . "duration") - (,ly:grob? . "grob (GRaphical OBject)") + (,ly:grob? . "layout object") (,ly:input-location? . "input location") - (,ly:input-location? . "input location") (,ly:moment? . "moment") (,ly:music? . "music") (,ly:pitch? . "pitch") (,ly:translator? . "translator") + (,ly:font-metric? . "font metric") (,markup-list? . "list of markups") (,markup? . "markup") - (,music-list? . "list of music") + (,ly:music-list? . "list of music") (,number-or-grob? . "number or grob") (,number-or-string? . "number or string") (,number-pair? . "pair of numbers") @@ -479,28 +531,99 @@ L1 is copied, L2 not. (define gc-protect-stat-count 0) (define-public (dump-gc-protects) (set! gc-protect-stat-count (1+ gc-protect-stat-count) ) - - (display - (map (lambda (y) - (let - ((x (car y)) - (c (cdr y))) - - (string-append - (string-join - (map object->string (list (object-address x) c x)) - " ") - "\n"))) - - (sort + (let* + ((protects (sort (hash-table->alist (ly:protects)) (lambda (a b) (< (object-address (car a)) - (object-address (car b))))) - - ) - (open-file (string-append + (object-address (car b)))))) + (outfile (open-file (string-append "gcstat-" (number->string gc-protect-stat-count) ".scm" ) "w"))) + (display "DUMPING...\n") + (display + (filter + (lambda (x) (not (symbol? x))) + (map (lambda (y) + (let + ((x (car y)) + (c (cdr y))) + + (string-append + (string-join + (map object->string (list (object-address x) c x)) + " ") + "\n"))) + protects)) + outfile))) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(define-public (ly:system command) + (let* + ((status 0) + + (silenced + (string-append command (if (ly:get-option 'verbose) + "" + " > /dev/null 2>&1 ")))) + + (if (ly:get-option 'verbose) + (format (current-error-port) (_ "Invoking `~a'...\n") command)) + + (set! status (system silenced)) + (if (> status 0) + (format (current-error-port) (_ "Error invoking `~a'. Return value ~a") + silenced status)))) + +;; +;; ugh - double check this. We are leaking +;; untrusted (user-settable) info to a command-line +;; +;; (regexp-substitute/global #f "[^[:alnum:]]" papersizename 'pre 'post)) +(define-public (postscript->pdf papersizename name) + (let* ((set-papersize (if (member papersizename (map car paper-alist)) + (string-append "-sPAPERSIZE=" papersizename " ") + "")) + (cmd (string-append "ps2pdf " set-papersize name)) + (pdf-name (string-append (basename name ".ps") ".pdf" ))) + (format (current-error-port) (_ "Converting to `~a'...") pdf-name) + (ly:system cmd))) + +(define-public (postscript->png resolution name) + (let + ((cmd (string-append + "ps2png --resolution=" + (if (number? resolution) + (number->string resolution) + "90 ") + (if (ly:get-option 'verbose) + "--verbose " + " ") + name))) + (ly:system cmd))) + +(define-public (lilypond-main files) + "Entry point for LilyPond." + (let* ((failed '()) + (handler (lambda (key arg) (set! failed (cons arg failed))))) + (for-each + (lambda (f) + (catch 'ly-file-failed (lambda () (ly:parse-file f)) handler) +;;; (dump-gc-protects) + ) + files) + + (if (pair? failed) + (begin + (newline (current-error-port)) + (display (_ "error: failed files: ") (current-error-port)) + (display (string-join failed) (current-error-port)) + (newline (current-error-port)) + (newline (current-error-port)) + (exit 1)) + (exit 0)))) +