]> git.donarmstrong.com Git - lilypond.git/blob - scm/c++.scm
patch::: 1.3.127.jcn2
[lilypond.git] / scm / c++.scm
1 ;;;; c++.scm -- implement Scheme frontends to C++ functions
2 ;;;;
3 ;;;;  source file of the GNU LilyPond music typesetter
4 ;;;; 
5 ;;;; (c) 1998--2000 Jan Nieuwenhuizen <janneke@gnu.org>
6 ;;;; Han-Wen Nienhuys <hanwen@cs.uu.nl>
7
8 ;;; Note: this file can't be used without LilyPond executable
9
10 (define (number-pair?  x)
11   (and (pair? x)
12        (number? (car x)) (number? (cdr x))))
13
14 (define (boolean-or-symbol? x)
15   (or (boolean? x) (symbol? x)))
16
17 (define (number-or-boolean? x)
18   (or (number? x) (boolean? x)))
19
20 (define (number-or-string? x)
21   (or (number? x) (string? x)))
22
23 (define (markup? x)
24   (or (string? x) (list? x)))
25
26 ;; ugh: code dup ; merge.
27 (define (object-type obj)
28   (cond
29    ((dir? obj) "direction")
30    ((number-pair? obj) "pair of numbers")
31    ((ly-input-location? obj) "input location")   
32    ((ly-grob? obj) "grob (GRaphical OBject)")
33    ((pair? obj) "pair")
34    ((integer? obj) "integer")
35    ((list? obj) "list")
36    ((symbol? obj) "symbol")
37    ((string? obj) "string")
38    ((boolean? obj) "boolean")
39    ((moment? obj) "moment")
40    ((number? obj) "number")
41    ((char? obj) "char")
42    ((input-port? obj) "input port")
43    ((output-port? obj) "output port")   
44    ((vector? obj) "vector")
45    ((procedure? obj) "procedure") 
46    ((boolean-or-symbol? obj) "boolean or symbol")
47    ((number-or-string? obj) "number or string")
48    ((number-or-boolean? obj) "number or boolean")
49    ((markup? obj) "markup (list or string)")
50    (else "unknown type")))
51
52
53 (define (type-name  predicate)
54   (cond
55    ((eq? predicate dir?) "direction")
56    ((eq? predicate number-pair?) "pair of numbers")
57    ((eq? predicate ly-input-location?) "input location")   
58    ((eq? predicate ly-grob?) "Grob")
59    ((eq? predicate pair?) "pair")
60    ((eq? predicate integer?) "integer")
61    ((eq? predicate list?) "list")
62    ((eq? predicate symbol?) "symbol")
63    ((eq? predicate string?) "string")
64    ((eq? predicate boolean?) "boolean")
65    ((eq? predicate moment?) "moment")
66    ((eq? predicate number?) "number")
67    ((eq? predicate char?) "char")
68    ((eq? predicate input-port?) "input port")
69    ((eq? predicate output-port?) "output port")   
70    ((eq? predicate vector?) "vector")
71    ((eq? predicate procedure?) "procedure") 
72    ((eq? predicate boolean-or-symbol?) "boolean or symbol")
73    ((eq? predicate number-or-string?) "number or string")
74    ((eq? predicate markup?) "markup (list or string)")
75    (else "unknown type")))
76
77
78 (define (uniqued-alist  alist acc)
79   (if (null? alist) acc
80       (if (assoc (caar alist) acc)
81           (uniqued-alist (cdr alist) acc)
82           (uniqued-alist (cdr alist) (cons (car alist) acc)))))
83
84
85
86 ;;(define (cons-map f x)
87 ;;  (cons (f (car x)) (f (cdr x))))
88
89
90 ;;(define (reduce operator list)
91 ;;      (if (null? (cdr list)) (car list)
92 ;;        (operator (car list) (reduce operator (cdr list)))))
93
94
95
96 ; Make a function that checks score element for being of a specific type. 
97 (define (make-type-checker symbol)
98   (lambda (elt)
99     ;;(display  symbol)
100     ;;(eq? #t (ly-get-elt-property elt symbol))
101     (not (eq? #f (memq symbol (ly-get-elt-property elt 'interfaces))))))
102
103
104 (define (index-cell cell dir)
105   (if (equal? dir 1)
106       (cdr cell)
107       (car cell)))
108
109 (define (repeat-name-to-ctor name)
110   (let*
111       ((supported-reps
112         `(("volta" . ((iterator-ctor . ,Volta_repeat_iterator::constructor)
113                       (length . ,Repeated_music::volta_music_length)))
114             ("unfold" . ((iterator-ctor . ,Unfolded_repeat_iterator::constructor)
115                        (length . ,Repeated_music::unfolded_music_length)))
116             ("fold" . ((iterator-ctor  . ,Folded_repeat_iterator::constructor)
117                        (length . ,Repeated_music::folded_music_length)))
118             ("tremolo" . ((iterator-ctor . ,Chord_tremolo_iterator::constructor)
119                           (length . ,Repeated_music::unfolded_music_length)))))
120           
121        (handle (assoc name supported-reps)))
122
123     (if (pair? handle)
124         (cdr handle)
125         (begin
126           (ly-warn
127            (string-append "Unknown repeat type `" name "'\nSee scm/lily.scm for supported repeats"))
128           '(type . 'repeated-music)))))