リテラル

**リテラル**・**直値**（）は、「文字どおり」「字義どおり」を意味する語で、 と同じくラテン語の （文字）に由来する。数理論理学とコンピュータプログラミングで異なる意味の専門用語として使われる。

## 数理論理学
リテラルとは、数理論理学において、原子論理式あるいは原子論理式の否定のこと。

**基礎リテラル**とは、リテラルのうち、変数を含んでいないものを指す。

共通な変数を持たない2つの節に対して、節のそれぞれのリテラルで使って再汎単一化要素をもち、二次元導出系 () を作る場合に**導出に使われたリテラル** () と呼ぶ。共通の変数を含まない2つの節で、推論した節の二次元等号調整系 () を作ったとき、**等号調整に使われたリテラル** () という。

## コンピュータプログラミング

コンピュータプログラミング言語においてリテラルは、ソースコード内に値を直接表記したものをいう。言語によってリテラルとして表記できる型の種類や表記方法は異なる。簡略に記述できることが好まれるスクリプティング言語はリテラルの種類が多い傾向にある。リテラル表記ができるかどうかはその型が第一級オブジェクトかどうかを検討する材料にもなるが、必ずしもそうとは限らない。静的に構文解析が可能なことが多いためシンタックスハイライトではたいてい色分けされる。なお言語によっては（標準規格等で）このリテラルのことを指して「定数」という用語を使っている場合もあるが、「リテラル」という語と使い分ける場合は、「定数」とは「初期化できるだけで、その後は値を変えられない変数」というようなものを指す。
;数値
:整数、浮動小数点数はほとんどの言語でサポートされる。他にも固定小数点数、複素数、実数、分数などに対応する言語がある。
:同じ種類のリテラルに対応していても言語ごとに機能面で違いがある。以下に挙げるのはその代表的なもの。
:*10進法以外に、2進法、8進法、16進法で表記できるか。また、その表記法。
:*`0.1F` のように型を明示するためのサフィックスがあるか。
:*`0.1` を `.1` と整数部を省略して書けるか。
:*数値の間に桁区切りとして `_` などを挟めるか。
;文字型
:`'A'`のようにシングルクォートで文字を挟み、また改行文字の`'\n'`のようにエスケープシーケンスが使える場合が多い。C/C++の従来の文字リテラルは標準規格でエンコーディングが規定されていないが、多くの処理系ではASCIIに準ずる。ワイド文字やUnicodeの1文字を表すものもある。LISP系言語（Schemeなど）では `#\A`、`#\newline` などのような記法である。
:文字コードを表すと考えて、数値型（整数型）に含める場合もある。多くの言語では文字リテラルは文字型を持つが、Cの文字リテラル（規格上の用語では文字定数）は型ではなく型である。専用の文字型を持たず、長さ1の文字列を文字として扱い、リテラルも区別しないという言語もある。
;文字列型（文字列リテラル）
:`"this is a string literal"`のようにダブルクォートや、シングルクォートで文字列を囲む場合が多いが、一つの言語に複数の記述法があり、特殊な記法が用意される場合もある。その際にはエスケープシーケンスの処理、文字列補間（式展開）の有無、文字列の終わりの解釈などがそれぞれ異なる。C/C++の文字列はヌル終端文字列だが、厳密な意味での文字列リテラルは存在せず、実際には末尾要素としてヌル文字を含む固定長の文字配列型である。
:また、改行やホワイトスペースをそのまま反映する文字列リテラルの記法を**[[ヒアドキュメント]]**と呼ぶ。特にプログラミング言語のソースコード内にスクリプト言語やデータ記述言語のソースコードを文字列として記述したり、正規表現を文字列として記述したりするときに便利である。C++11では生の文字列リテラル (raw string literal) と呼ばれる。C#ではもともと逐語的文字列リテラル (verbatim string literal) と呼ばれる機能が備わっていたが、C# 11ではさらにダブルクォートのエスケープも不要となる生文字列リテラルの機能が追加された。
;関数
:関数リテラルは関数を第一級オブジェクトとして扱える言語に備わっている。
:無名関数（ラムダ式）を表現する。クラスなどに関数が定義できるだけでは関数リテラルとはみなされない。
:同様の機能であっても関数リテラルと呼ばない言語もある。第一級関数も参照。
;正規表現
:`/regex/`のようにスラッシュで挟む。「大文字小文字を区別しない」等々のオプションが後ろに付けることができるような仕様であることが多い。
;配列
:配列のリスト初期化構文をサポートする言語は多いが、配列のリテラルをサポートしているとは限らない。
:C言語をはじめとするC系の言語では、`{1, 2, 3}`のように要素をコンマで区切り、ブレースで囲む。ただしC/C++では、この記法は「初期化子リスト」であり、配列のリテラルではない。Javaでは「配列初期化子」、C#では「コレクション初期化子」であり、ともに配列のリテラルではない。
:RubyやJavaScriptなどは、`[1, 2, 3]`のようにブラケットで囲む。
:Pythonはリストのリテラル`[1, 2, 3]`、タプルのリテラル`(1, 2, 3)`、セットのリテラル`{1, 2, 3}`をサポートするが、配列（数値用のコンパクトなコレクション表現）のリテラルはサポートしない。
:OCamlおよびF#は配列のリテラル（`[| 1; 2; 3 |]`など）およびリストのリテラル（`[ 1; 2; 3 ]`など）をサポートする。
:Goは`[3]int{1, 2, 3}`のように要素数と型を指定することで配列（固定長のコレクション）のリテラルとなる。`[]int{1, 2, 3}`のように要素数を省略するとスライス（可変長のコレクション）のリテラルとなる。
;連想配列
:一例としては、`{"hoge":1, "piyo":2}` といったように書く。このように書いた場合は、キーが"hoge"で値が1のペアと、キーが"piyo"で値が2のペアの配列を示す。キーと値の間の記号が`=&gt;`や`-&gt;`であることがある。
;オブジェクトリテラル
:JavaScriptではオブジェクトが属性名と属性値のペアの集まりであり、前述の連想配列のようにしてオブジェクトをリテラルとして書ける。
:JavaScriptにおけるオブジェクトリテラルと、その他の基本的なデータ型（文字列と数値と真理値）のリテラル記法の組み合わせは、階層構造を持つデータを記述するのに便利である。データ記述言語のひとつに、JavaScriptの構文と意味からリテラルの部分だけを取り出したサブセットとして規格化されたJSONがある。
;構造体（レコード）
:構造体のリスト初期化や指示付き初期化の構文をサポートする言語は多いが、構造体のリテラルをサポートしているとは限らない。
:C言語のC99規格以降では、designated initializer（指示付き初期化子または指示初期化子）のサポートにより、任意の構造体において任意のメンバの初期値について指示ができる。C++20規格でも同様の指示付き初期化機能のサブセットが導入された。
;複合リテラル (compound literal)
:C言語のC99規格以降では、compound literal（複合リテラル）のサポートにより、従来はリテラルを書けなかった型のうちいくつかについて、リテラルを書けるようになった。例えば、配列の場合は`(int[]){ 1, 2, 3 }`のように書き、構造体の場合は`(struct tm){ .tm_year = 107, .tm_mon = 7, .tm_mday = 24 }`のように書く。
;ユーザー定義リテラル (user-defined literal)
:C++のC++11規格以降では、演算子オーバーロードによりプログラマが任意の型のリテラルを定義できるようになった。
;null
:`null`、`nil`、`nullptr`
;真偽値
:`false`/`true`、`#f`/`#t`
;シンボル
:`'symbol`、`:symbol`
;ベクター
:`#(1.2 3.4 cat)`（Schemeでの例）
;範囲
:`[1, 8)`（ の  言語での例）

### 例
下のC#コードにおいて、`7`, `3.14`, `true`, `"hello"`がそれぞれの型のリテラルである。

```csharp
int x = 7;
double pi = 3.14;
bool flag = true;
string s = "hello";
```

C#ではリテラルもオブジェクトであり、以下のようにメソッドを呼び出すこともできる。

```csharp
using System;

Console.WriteLine(7.GetType());
Console.WriteLine(3.14.GetType());
Console.WriteLine(true.GetType());
Console.WriteLine("hello".GetType());
```

出力結果は以下のようになる（C#の組み込み型は、.NETのCLR型へのエイリアスである）。

```text
System.Int32
System.Double
System.Boolean
System.String
```


## 参考文献
*  原書: Symbolic Logic and Mechanical Theorem Proving

## 脚注
### 注釈

### 出典

## 関連項目
* 値 (計算機科学)