LilyPond 記譜法リファレンス: A.16 技術用語集

## A.16 技術用語集

LilyPond の内部で用いられる技術的な用語やコンセプトの一覧です。これらはマニュアル、メーリング リスト、ソースコードなどに現れます。

### alist (連想配列)

連想配列 (association list, 縮めて alist) は、キーと値を結びつける Scheme ペアです: ‘`(key . value)`’。例えば ‘`scm/lily.scm`’ には、連想配列 “type-p-name-alist” があり、型述語 (例えば `ly:music?`) と型の名前 (例えば “music”) を結びつけています。そのため、型チェックに失敗した場合には、型述語に結びついた名前がエラー メッセージに表示されます。

### callback (コールバック)

コールバック (callback) はルーチン、関数、メソッドの一種で、他のルーチンの引数にその参照が渡されることで呼び出されるものです。このテクニックを用いて、低レベルのソフトウェア レイヤから高レベルで定義した関数を呼び出すことができます。LilyPond では、コールバックは、低レベルのアクションがどれぐらい実行されるかをユーザ レベルの Scheme コードが定義できるようにするために広く使われています。

### closure (クロージャ)

Scheme では、クロージャ (closure) は関数 (通常はラムダ式) が変数として渡された際に作られます。クロージャは、関数のコードと共に、関数における自由変数 (つまり、関数の中で使われているが、関数の外で定義されている変数) の静的束縛 (lexical binding) への参照が含まれます。この関数が異なる引数で再度呼ばれた際、クロージャで捕捉された自由変数の束縛が、 計算で使用される自由変数の値を得るために使われます。クロージャの便利な性質の一つは、内部変数の値を複数の呼び出しの間で保持できることです。これにより、状態を保存することができます。

### glyph (グリフ)

グリフ (glyph) は印刷される文字一つ一つの形、あるいは複数の文字が組み合わされて合字となった際の形を表します。あるスタイルや形のグリフが集まってフォントを形成し、いくつかのスタイルやサイズのフォントが集まると書体となります。

#### 参照

記譜法リファレンス: フォント, 特殊文字

### grob (グラフィカル オブジェクト)

LilyPon のオブジェクトの内、 符頭、符幹、スラー、タイ、運指、音部記号などの、印刷される出力におけるアイテムを表すものは、‘レイアウト オブジェクト’ (‘layout object’) またはよく グラフィカル オブジェクト (‘GRaphical OBject’, 略して grob) と呼ばれます。これらは `Grob` クラスのインスタンスとして表されます。

#### 参照

学習マニュアル: Objects and interfaces, Naming conventions of objects and properties, Properties of layout objects

内部リファレンス: grob-interface, All layout objects

### immutable (イミュータブル)

イミュータブルな (immutable) オブジェクトは、生成された後にも状態を変更できるミュータブル オブジェクトとは異なり、生成された後は状態を変更できないオブジェクトを指します。

LilyPond では、イミュータブル プロパティまたは共有プロパティはデフォルトのスタイルや Grob の挙動を定義します。これらは多くのオブジェクトの間で共有されます。名前に反して実際には `\override` や `\revert` で変更することができます。

#### 参照

記譜法リファレンス: mutable (ミュータブル)

### interface (インターフェイス)

複数の Grob で共通のアクションやプロパティは、`grob-interface` あるいは短く‘インターフェイス’ (‘interface’) と呼ばれるオブジェクトにまとめられます。

#### 参照

学習マニュアル: Objects and interfaces, Naming conventions of objects and properties, Properties found in interfaces

記譜法リファレンス: レイアウト インターフェイス

内部リファレンス: Graphical Object Interfaces

### lexer (字句解析器)

字句解析器 (lexer) は、文字列をトークンの列に変換する、字句解析を行うプログラムです。LilyPond の字句解析器は、‘`.ly`’ ファイルから取得されるストリームをトークン化したストリームに変換し、構文解析という次の処理により適した形にします。構文解析については parser (構文解析器、パーサ) を参照してください。LilyPond の字句解析器は Flex を用いて、字句に関する規則を定義したファイル ‘`lily/lexer.ll`’ から作られます。このファイルはソース コードの一部であり、LilyPond のバイナリには含まれていません。

### mutable (ミュータブル)

ミュータブルな (mutable) オブジェクトは、生成された際に状態が固定されるイミュータブル オブジェクトとは異なり、生成された後にも状態を変更できるオブジェクトを指します。

LilyPond では、ミュータブル プロパティは Grob ごとに固有の値を保持するために用いられます。通常、他のオブジェクトのリストや、計算結果がミュータブル プロパティに格納されます。

#### 参照

記譜法リファレンス: immutable (イミュータブル)

### output-def (出力定義クラス)

`Output-def` クラスのインスタンスは、出力ブロックに関連したデータ構造やメソッドを保持します。インスタンスは midi, layout, paper ブロックに対して作られます。

### parser (構文解析器、パーサ)

構文解析器 (parser, パーサ) は、字句解析器によって出力されたトークンの列を文法規則に従ってより大きなグループにまとめていくことによって、その文法的構造を決定します。トークンの列が正しいものであれば、結果はトークンの木構造となり、その根は文法の始端記号になります。結果が得られない場合には入力が誤っており、正しいエラー メッセージが出力されます。文法的なグループと、そのグループを作り上げる LilyPond の文法は、‘`lily/parser.yy`’ に定義されており、 LilyPond grammar にあるようにバッカス標準形 (Backus Normal Form, BNF) で記述されています。このファイルはプログラムのビルド時に Bison にによって構文解析器を生成する際に用いられます。このファイルはソース コードの一部であり、LilyPond のバイナリには含まれていません。

### parser variable (パーサ変数)

これらは Scheme で直接定義される変数です。これらをユーザが直接操作することは、変数のスコープが難解であるため推奨されません。

このような変数が ‘`.ly`’ ファイル内で変更された場合、変更はグローバルに適用され、明示的に戻さない限り、新たな値がファイルの最後まで保持されます。そのため、後に続く `\score` ブロックや、`\include` コマンドで読み込まれた外部ファイルの出力に影響します。これは予期しない結果を生み出す可能性があり、複雑なプロジェクトではエラーを追跡するのが難しくなります。

LilyPond は以下のパーサ変数を使用します:

- afterGraceFraction
- musicQuotes
- mode
- output-count
- output-suffix
- partCombineListener
- pitchnames
- toplevel-bookparts
- toplevel-scores
- showLastLength
- showFirstLength

### prob (プロパティ オブジェクト)

プロパティ オブジェクト (PRoperty OBject, 略して prob) は、`Prob` クラスのインスタンスであり、ミュータブルまたはイミュータブルなプロパティの連想配列や、それらを操作するメソッドを保持するシンプルな基底クラスです。`Music` や `Stream_event` クラスは `Prob` から派生しています。`Prob` クラスは、ページ レイアウトの際にシステム Grob やタイトル ブロックのフォーマットされた内容を保持するためにも生成されます。

### smob (Scheme オブジェクト)

Scheme オブジェクト (ScheMe OBjects, 略して smob) は、C や C++ オブジェクトを Scheme コードにエクスポートする際に Guile によって用いられます。LilyPond では、Scheme オブジェクトはマクロを用いて C++ オブジェクトから生成されます。Scheme オブジェクトには 2 種類あります: 数値のような単純なイミュータブル オブジェクトを格納するシンプル smob と、自身を持つオブジェクトに用いられる複合 smob です。LilyPond のソース コードがアクセスできる場合、より詳しい情報は ‘`lily/includes/smobs.hh`’ にあります。

### stencil (ステンシル)

ステンシル (stencil) クラスのインスタンスは、印刷に出力されるオブジェクトの情報を保持します。ステンシルは、オブジェクトの縦方向と横方向の大きさを決定するボックスと、評価された際にオブジェクトを出力する Scheme 式からなる シンプルな Scheme オブジェクトです。いくつかのステンシルの Scheme 式を組み合わせて複雑なステンシルを定義することもできます。

`stencil` プロパティは、`grob-inteface` で定義されており、grob とステンシルを繋ぐ役目を果たします。

#### 参照

内部リファレンス: grob-interface

#### LilyPond — 記譜法リファレンス v2.22.2 (安定版).

- 2. 専門的な記譜法
- 3. 入出力全般
- 4. スペースの問題
- 5. デフォルトを変更する
- A. 付表
- B. カンニング ペーパー
- C. GNU Free Documentation License
- D. LilyPond コマンド インデックス
- E. LilyPond インデックス