[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: chose module name instead of *anonymous-ly-NN*?
From: |
Nicolas Sceaux |
Subject: |
Re: chose module name instead of *anonymous-ly-NN*? |
Date: |
Sat, 17 Apr 2004 14:54:13 +0200 |
User-agent: |
Gnus/5.1006 (Gnus v5.10.6) Emacs/21.3 (gnu/linux) |
Sat, 17 Apr 2004 12:45:34 +0200, Nicolas a dit :
> In the meantime I am trying some hacks to achieve the following:
> (define (textoffset dx dy)
> #{ \property Voice.TextScript #'offset = #(cons $dx $dy) #})
> that would expand in the following:
> (define (textoffset dx dy)
> (ly:parse-string (format #f " \property Voice.TextScript #'offset = #(cons
> ~a ~a) "
> dx dy)))
> and returns, when called, the music expression with the appropriate
> values inserted. I don't find it very eleguant, but it may be handy in
> user lily code. (I don't think `$' is often used in lily files?)
> nicolas
Here is a possible implementation, using the temp dirty
ly:parse-string
-------------------- scm/toto.scm ----------------------
(define-module (lily))
(export ly:parse-file)
(define-module (scm toto))
(use-modules (ice-9 format) (lily))
(define-public (ly:parse-string str)
"Fake!"
(let ((port (open-output-file "/tmp/tmplily.ly")))
(format port "vartmp = \\notes { ~a }
#(export vartmp)
#(define-module (scm toto))
#(use-modules (ice-9 format) (*anonymous-ly-15*))~%" str)
(close-port port)
(ly:parse-file "/tmp/tmplily.ly")
vartmp))
(define-public (read-lily-expression chr port)
(let* ((format-args '())
(lily-string (with-output-to-string
(lambda ()
(do ((c (read-char port) (read-char port)))
((and (char=? c #\#)
(char=? (peek-char port) #\}))
(read-char port))
(cond ((and (char=? c #\$)
(not (char=? (peek-char port) #\$)))
;; a $variable
(display "~a")
(set! format-args (cons (read port)
format-args)))
((and (char=? c #\$)
(char=? (peek-char port) #\$))
;; just a $ character
(display (read-char port)))
(else
;; other caracters
(display c))))))))
`(ly:parse-string (format #f ,lily-string ,@(reverse! format-args)))))
(read-hash-extend #\{ read-lily-expression)
-------------------- scm/toto.scm ----------------------
---------------------- foo.ly --------------------------
#(use-modules (scm toto))
#(define (textoffset dx dy)
#{ \override Voice.TextScript #'extra-offset = #(cons $dx $dy) #})
myoffset=#(textoffset 3 -4)
\score {
\notes {
c'^"normal text"
%% uhrg, I cannot write scheme here
%% #(textoffset 3 -4)
\myoffset
c'^"text with offset"
}
}
---------------------- foo.ly --------------------------
which gives the expected result.
(this example is not exactly convincing)
chose module name instead of *anonymous-ly-NN*?, Han-Wen Nienhuys, 2004/04/17
Re: chose module name instead of *anonymous-ly-NN*?, Jan Nieuwenhuizen, 2004/04/21