リテラルとは
リテラル(literal)とは、「
文字どおり」「字義どおり」を
意味する言葉で、
ラテン語の「littera」(
文字)に由来します。
数理[[論理学]]と
コンピュータプログラミングの分野で、それぞれ異なる
意味を持つ
専門用語として使われます。
数理[[論理学]]におけるリテラルとは、
原子論理式、または
原子論理式の否定のことです。
基礎リテラル: 変数を含まないリテラルのことを指します。
導出に使われたリテラル (literal resolved upon): 共通の変数を持たない2つの節において、二次元導出系を作成する際に導出に使われるリテラルのことです。
等号調整に使われたリテラル (literal paramodulated upon): 共通の変数を含まない2つの節で、二次元等号調整系を作成する際に等号調整に使われるリテラルのことです。
コンピュータプログラミングにおけるリテラル
コンピュータプログラミングにおいて、リテラルとは、ソースコード内に値を直接記述したものを指します。リテラルとして記述できる型やその記述方法はプログラミング言語によって異なります。一般的に、簡潔に記述できるスクリプティング言語ではリテラルの種類が多い傾向があります。リテラル表記の可否は、その型が第一級オブジェクトであるかどうかの検討材料となりますが、必ずしもそうとは限りません。リテラルは静的に構文解析が可能であることが多いため、シンタックスハイライトで色分けされることが多いです。言語によってはリテラルを「定数」と呼ぶこともありますが、「リテラル」と区別する場合は、「定数」は初期化後に値を変更できない変数を指します。
リテラルの種類
リテラルには様々な種類があり、それぞれ異なる記述方法を持ちます。
数値: 整数、
浮動小数点数などの数値リテラルは、ほとんどの言語でサポートされています。その他にも、固定小数点数、複素数、実数、分数などに対応する言語もあります。数値リテラルは、10進法以外に2進法、8進法、16進法で表記できるか、型を明示するためのサフィックスがあるか、整数部を省略して書けるか、桁区切り
文字を使用できるかなど、言語によって機能が異なります。
文字型: 文字リテラルは、通常シングルクォートで文字を囲んで表現されます。エスケープシーケンスを使用して改行文字などを表すこともできます。文字コードを表す数値型(整数型)に含める場合もあります。C/C++の文字リテラルはASCIIに準拠していますが、ワイド[[文字]]やUnicodeの文字を表すものもあります。LISP系言語では`#\A`のように表記します。C言語の文字リテラルはchar型ではなくint型である点に注意が必要です。
文字列型 (文字列リテラル):
文字列リテラルは、ダブルクォートやシングルクォートで
文字列を囲んで表現されることが多いです。一つの言語に複数の記述法があり、特殊な記法が用意される場合もあります。
エスケープシーケンスの処理、
文字列補間(式展開)の有無、
文字列の終わりの解釈などが記述法によって異なります。C/
C++の
文字列は
ヌル終端[[文字列]]ですが、厳密な
意味での
文字列リテラルは存在せず、実際には末尾要素として
ヌル[[文字]]を含む固定長の
文字配列型です。また、
改行やホワイトスペースをそのまま反映する
文字列リテラルの記法をヒアドキュメントと呼びます。
C++11ではraw string literal、C#ではverbatim string literalやraw string literalとして知られています。
関数: 関数リテラルは、関数を第一級オブジェクトとして扱える言語に備わっています。無名関数(ラムダ式)を表現するために使用されます。クラスに関数が定義できるだけでは関数リテラルとはみなされません。
正規表現:
正規表現リテラルは、通常`/regex/`のようにスラッシュで挟んで表現されます。「大
文字小
文字を区別しない」等のオプションを後ろに付けることができます。
配列: 配列のリスト初期化構文をサポートする言語は多いですが、配列のリテラルをサポートしているとは限りません。C言語では`{1, 2, 3}`のように要素をコンマで区切り、ブレースで囲みます。RubyやJavaScriptなどでは`[1, 2, 3]`のようにブラケットで囲みます。Pythonはリスト、タプル、セットのリテラルをサポートしますが、配列のリテラルはサポートしません。OCamlやF#は配列とリストのリテラルをサポートし、Goは要素数と型を指定して配列のリテラルを作成します。要素数を省略するとスライスのリテラルになります。
連想配列: 連想
配列は、`{"hoge":1, "piyo":2}`のようにキーと値のペアで表現します。キーと値の間の
記号は言語によって異なります。
オブジェクトリテラル: JavaScriptでは、オブジェクトが属性名と属性値のペアの集まりであり、連想配列のようにオブジェクトをリテラルとして記述できます。オブジェクトリテラルは、の基盤となる構造です。
構造体 (レコード):
構造体のリスト初期化や指示付き初期化構文をサポートする言語は多いですが、
構造体のリテラルをサポートしているとは限りません。
C言語の
C99規格以降では、指示付き初期化子を使用して
構造体の任意のメンバを初期化できます。
C++20でも同様の機能が導入されました。
複合リテラル (compound literal): C言語のC99規格以降では、複合リテラルを使用して配列や構造体などのリテラルを記述できるようになりました。例えば、配列の場合は`(int[]){ 1, 2, 3 }`のように記述します。
ユーザー定義リテラル (user-defined literal):
C++11以降では、演算子オーバーロードによりプログラマが任意の型のリテラルを
定義できるようになりました。
*
その他: `null`、`nil`、`nullptr`、`true`/`false`、`#t` /`#f`、`'symbol`、`:symbol`、`#(1.2 3.4 cat)`、`[1, 8)`など、言語や分野によって様々なリテラルが存在します。
リテラルの例
以下は、C#におけるリテラルの例です。
csharp
int x = 7; // 7 は整数リテラル
double y = 3.14; // 3.14 は
浮動小数点数リテラル
bool z = true; // true は真偽値リテラル
string s = "hello"; // "hello" は
文字列リテラル
Console.WriteLine(7.GetType());
Console.WriteLine(3.14.GetType());
Console.WriteLine(true.GetType());
Console.WriteLine("hello".GetType());
このコードの出力結果は以下のようになります。
System.Int32
System.Double
System.Boolean
System.String
まとめ
リテラルは、プログラミングや
数理[[論理学]]において、値を直接的に記述するための重要な概念です。リテラルの種類や記述方法は言語や分野によって異なりますが、それぞれの文脈で適切なリテラルを使用することで、コードの可読性や効率性を高めることができます。