Janek Warchoł <janek.lilyp...@gmail.com> writes:

> 2012/1/3 David Kastrup <d...@gnu.org>:

>> LilyPond needs to get into a state where, say, half the
>> engravers are written and maintained in Scheme.  And by "Scheme" I don't
>> mean "Scheme at the level Nicolas can barely handle" but "Scheme a
>> Fortran programmer would not have all too much of a problem
>> understanding".
>
> Umm, impossible?  From my perspective, 'Scheme' and 'easy to
> understand' are mutually exclusive.  Unless there are more comments
> than code - literally - but we don't do so.

Well, as an example, take a look at
<URL:http://nicolas.sceaux.free.fr/prelude/prelude.html>

Now take a look at

\begin{lilypond}
ph = #(define-music-function (parser location p1 p2 p3 p4 p5)
       (ly:pitch? ly:pitch? ly:pitch? ly:pitch? ly:pitch?)
       #{
          \repeat unfold 2 { $p1 2 } |
          \repeat unfold 2 { r16 $p2 8. ~ $p2 4 } |
          \repeat unfold 2 { r8 $p3 16 $p4 $p5 $p3 $p4 $p5 } |
       #})  
\parallelMusic #'(low middle high)
{
  \ph c'   e'  g' c'' e''
  R1*7 | \skip 1*7 | R1*7 |
  \ph a    c'  e' g' c''
  \voiceTwo | \change Staff = "down" \voiceOne | \oneVoice |
  \ph d    a   d' fis' c''
  R1*21 | \skip 1*21 | R1*21 |
  \ph c,   c   g bes e'
  c,2~ c, | r16 c8. ~ c4 ~ c2
  | r8 f16 a c' f' c' a c' a f a f d f d |
  c,2~ c, | r16 b,8. ~ b,4 ~ b,2
  | r8 g'16 b' d'' f'' d'' b' d'' b' g' b' d' f' e' d' |
  c,1\fermata | c1 | <e' g' c''>1\fermata \bar "|." |
}
\score {
  \new PianoStaff <<
    \new Staff = "up" {
      << \high \\ \middle >>
    }
    \new Staff = "down" {
      \clef bass
      \low
    }
  >>
  
  \midi {
    \context {
      \Score
      \with \settingsFrom { \tempo 4 = 80 }
    }
  }

  \layout {
    \context {
      \Score
      \with \settingsFrom { \compressFullBarRests }
    }
    \context {
      \Staff
      \with \settingsFrom { \accidentalStyle modern }
    }
  }
}  
\end{lilypond}

\ph is a music function written in Scheme.  Can you understand it?
\settingsFrom is actually returning a Scheme expression for \with to
use.  It makes things rather simpler than more complex, even though it
constitutes a Scheme expression.

Scheme is not hard.  Programming is hard.  And there is still far too
much repetitive programming required for stuff that could be handled
using shrinkwrapped tools (\settingsFrom is such a tool) if anybody had
bothered packaging them.  Far too often if I think "Ok, task x has no
documented way of dealing with it.  Let's see whether we can find an
undocumented API".  And then I find about 10 files implementing their
own ad hoc API that will break in different ways if one has to change
the data structures at some point of time.

-- 
David Kastrup


_______________________________________________
lilypond-devel mailing list
lilypond-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/lilypond-devel

Reply via email to