Sintaxis de la definición de instrucciones de marcado
Se pueden definir instrucciones de marcado nuevas usando el macro
de Scheme define-markup-command
, en el nivel sintáctico
superior.
(define-markup-command (nombre-de-la-instruccion layout props arg1 arg2 …) (tipo-de-arg1? tipo-de-arg2? …) [ #:properties ((propiedad1 valor-predeterminado1) …) ] …command body…)
Los argumentos son
nombre-de-la-instruccion
nombre de la instrucción de marcado
layout
la definición de ‘layout’ (disposición).
props
una lista de listas asociativas, que contienen todas las propiedades activas.
argi
argumento i-ésimo de la instrucción
tipo-de-argi?
predicado de tipo para el argumento i-ésimo
Si la instrucción utiliza propiedades de los argumentos
props
, se puede usar la palabra clave #:properties
para especificar qué propiedades se usan, así como sus valores
predeterminados.
Los argumentos se distinguen según su tipo:
- un marcado, que corresponde al predicado de tipo
markup?
; - una lista de marcados, que corresponde al predicado de tipo
markup-list?
; - cualquier otro objeto de Scheme, que corresponde a predicados de tipo como
list?
,number?
,boolean?
, etc.
No existe ninguna limitación en el orden de los argumentos
(después de los argumentos estándar layout
y
props
). Sin embargo, las funciones de marcado que toman
un elemento de marcado como su último argumento son un poco
especiales porque podemos aplicarlas a una lista de marcados y el
resultado es una lista de marcados donde la función de marcado
(con los argumentos antecedentes especificados) se ha aplicado a
todos los elementos de la lista de marcados original.
Dado que la replicación de los argumentos precedentes para aplicar una función de marcado a una lista de marcados es poco costosa principalmente por los argumentos de Scheme, se evitan las caídas de rendimiento simplemente mediante la utilización de argumentos de Scheme para los argumentos antecedentes de las funciones de marcado que toman un marcado como su último argumento.
Las instrucciones de marcado tienen un ciclo de vida más bien
complejo. El cuerpo de la definición de una instrucción de
marcado es responsable de la conversión de los argumentos de la
instrucción de marcado en una expresión de sello que se devuelve.
Muy a menudo esto se lleva a cabo llamando a la función
interpret-markup
sobre una expresión de marcado, pasándole
los argumentos layout y props. Por lo general, estos
argumentos se conocen solamente en una fase muy tardía de la
composición tipográfica. Las expresiones de marcado ya tienen
sus componentes ensamblados dentro de expresiones de marcado
cuando se expanden las instrucciones \markup
(dentro de
una expresión de LilyPond) o la macro markup
(dentro de
Scheme). La evaluación y la comprobación de tipos de los
argumentos de la instrucción de marcado tiene lugar en el momento
en que se interpretan \markup
o markup
.
Pero la conversión real de expresiones de marcado en expresiones
de sello mediante la ejecución de los cuerpos de función de
marcado solo tienen lugar cuando se llama a
interpret-markup
sobre una expresión de marcado.