<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <!-- header_tag --> <html lang="en"> <head> <title>Input variables and Scheme - GNU LilyPond Notation Reference</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta name="description" content="GNU LilyPond Notation Reference"> <meta name="generator" content="makeinfo 4.11"> <link title="Top" rel="start" href="index.fr.html#Top"> <link rel="up" href="Programmer-interfaces.fr.html#Programmer-interfaces" title="Programmer interfaces"> <link rel="next" href="Internal-music-representation.fr.html#Internal-music-representation" title="Internal music representation"> <link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage"> <!-- Copyright (C) 1999--2007 by the authors Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; with no Invariant Sections. A copy of the license is included in the section entitled ``GNU Free Documentation License''. --> <meta http-equiv="Content-Style-Type" content="text/css"> <style type="text/css"><!-- pre.display { font-family:inherit } pre.format { font-family:inherit } pre.smalldisplay { font-family:inherit; font-size:smaller } pre.smallformat { font-family:inherit; font-size:smaller } pre.smallexample { font-size:smaller } pre.smalllisp { font-size:smaller } span.sc { font-variant:small-caps } span.roman { font-family:serif; font-weight:normal; } span.sansserif { font-family:sans-serif; font-weight:normal; } hr { border:0; height:1; color: #000000; background-color: #000000; } /* hr { border: none; height: 1px; color: #666666; background-color: #666666; } body { border-left: 1px solid #666666; border-right: 1px solid #666666; color: #332d28; margin-right: auto; margin-left: auto; width: 60em; list-style-type: square; font-family: Arial,Helvetica,sans-serif; padding-right: 1em; padding-left: 1em; } a { border-bottom: 1px dashed #344242; text-decoration: none; color: #344242; } a:link { text-decoration: none; } a:visited { border-bottom: 1px dashed #666666; color: #666666; } a:active { border-bottom: 1px solid #00cccc; color: #00cccc; } a:hover { border-bottom: 1px solid #1d7b85; color: #1d7b85; } blockquote { border: 1px solid #cccccc; padding: 3px; width: 40em; } .node { border-left: 1px solid #666666; margin: -0.5em 0px 1em; padding: 2px 1px 0px; font-style: italic; } .node a { border: none; text-decoration: underline; font-style: normal; font-weight: bold; } .verbatim { font-family: "Courier New",Courier,monospace; } .unnumberedsubsubsec { font-size: large; color: #1d7b85; } .subsubheading { font-size: large; color: #3b220d; } .contents { border: 1px dashed #339999; margin: 3px 2em; list-style-type: square; padding-right: 1em; width: 40em; background-color: #fcfff9; } .contents a { border-bottom: 1px dashed #423d34; text-decoration: none; color: #423d34; } .contents a:visited { border-bottom: 1px dashed #666666; color: #666666; } .contents a:active { border-bottom: 1px solid #f0d86d; color: #f0d86d; } .contents a:hover { border-bottom: 1px solid #3b220d; color: #3b220d; } .menu { border-left: 1px dashed #339999; margin: 3px 2em 1em; list-style-type: square; padding-left: 1.4em; width: 40em; } .unnumbered { } h2 { font-size: x-large; color: #1d7b85; } */ --></style> </head> <BODY BGCOLOR=WHITE TEXT=BLACK> <div class="node"> <p> <a name="Input-variables-and-Scheme"></a> Next: <a rel="next" accesskey="n" href="Internal-music-representation.fr.html#Internal-music-representation">Internal music representation</a>, Up: <a rel="up" accesskey="u" href="Programmer-interfaces.fr.html#Programmer-interfaces">Programmer interfaces</a> <hr> </div> <h4 class="subsection">6.2.1 Input variables and Scheme</h4> <p>The input format supports the notion of variables: in the following example, a music expression is assigned to a variable with the name <code>traLaLa</code>. <pre class="example">traLaLa = { c'4 d'4 } </pre> <p class="noindent">There is also a form of scoping: in the following example, the <code>\layout</code> block also contains a <code>traLaLa</code> variable, which is independent of the outer <code>\traLaLa</code>. <pre class="example">traLaLa = { c'4 d'4 } \layout { traLaLa = 1.0 } </pre> <p>In effect, each input file is a scope, and all <code>\header</code>, <code>\midi</code>, and <code>\layout</code> blocks are scopes nested inside that toplevel scope. <p>Both variables and scoping are implemented in the GUILE module system. An anonymous Scheme module is attached to each scope. An assignment of the form <pre class="example">traLaLa = { c'4 d'4 } </pre> <p class="noindent">is internally converted to a Scheme definition <pre class="example">(define traLaLa <var>Scheme value of `</var><code>... </code><var>'</var>) </pre> <p>This means that input variables and Scheme variables may be freely mixed. In the following example, a music fragment is stored in the variable <code>traLaLa</code>, and duplicated using Scheme. The result is imported in a <code>\score</code> block by means of a second variable <code>twice</code>: <pre class="verbatim"> traLaLa = { c'4 d'4 } %% dummy action to deal with parser lookahead #(display "this needs to be here, sorry!") #(define newLa (map ly:music-deep-copy (list traLaLa traLaLa))) #(define twice (make-sequential-music newLa)) { \twice } </pre> <p> <a href="../73/lily-16e287d9.ly"> <img align="middle" border="0" src="../73/lily-16e287d9.png" alt="[image of music]"> </a> </p> <p>Due to parser lookahead <p>In this example, the assignment happens after parser has verified that nothing interesting happens after <code>traLaLa = { ... }</code>. Without the dummy statement in the above example, the <code>newLa</code> definition is executed before <code>traLaLa</code> is defined, leading to a syntax error. <p>The above example shows how to ‘export’ music expressions from the input to the Scheme interpreter. The opposite is also possible. By wrapping a Scheme value in the function <code>ly:export</code>, a Scheme value is interpreted as if it were entered in LilyPond syntax. Instead of defining <code>\twice</code>, the example above could also have been written as <pre class="example">... { #(ly:export (make-sequential-music (list newLa))) } </pre> <p>Scheme code is evaluated as soon as the parser encounters it. To define some Scheme code in a macro (to be called later), use <a href="Void-functions.fr.html#Void-functions">Void functions</a>, or <pre class="example">#(define (nopc) (ly:set-option 'point-and-click #f)) ... #(nopc) { c'4 } </pre> <p class="noindent"> <h5 class="subsubheading">Known issues and warnings</h5> <p>Mixing Scheme and LilyPond variables is not possible with the <code>--safe</code> option. <!-- footer_tag --><br><hr> <div class="node"> <p> Next: <a rel="next" accesskey="n" href="Internal-music-representation.fr.html#Internal-music-representation">Internal music representation</a>, Up: <a rel="up" accesskey="u" href="Programmer-interfaces.fr.html#Programmer-interfaces">Programmer interfaces</a> </div> <div style="background-color: #e8ffe8; padding: 2; border: #c0ffc0 1px solid;"> <p> <font size="-1"> Cette page documente LilyPond-2.11.57 (branche de développement). <br> <address> Rapportez toute anomalie en français à <a href="mailto:lilypond-user-fr@gnu.org">lilypond-user-fr@gnu.org</a> ou en anglais à <a href="http://post.gmane.org/post.php?group=gmane.comp.gnu.lilypond.bugs">http://post.gmane.org/post.php?group=gmane.comp.gnu.lilypond.bugs</a> </address> <br> Vos <a href="http://lilypond.org/web/devel/participating/documentation-adding">suggestions à propos de la documentation</a> sont les bienvenues. </font> </p> </div> </BODY></html>