リテラル
リテラル(英: literal)は、「文字どおり」「字義どおり」を意味する語で、letter と同じくラテン語の littera(文字)に由来する。数理論理学とコンピュータプログラミングで異なる意味の専門用語として使われる。
数理論理学
リテラルとは、数理論理学において、原子論理式あるいは原子論理式の否定のこと。
基礎リテラルとは、リテラルのうち、変数を含んでいないものを指す。
共通な変数を持たない2つの節に対して、節のそれぞれのリテラルで使って再汎単一化要素をもち、二次元導出系 (英: binary resolvant) を作る場合に導出に使われたリテラル (英: literal resolved upon) と呼ぶ。共通の変数を含まない2つの節で、推論した節の二次元等号調整系 (英: binary paramodulant) を作ったとき、等号調整に使われたリテラル (英: literal paramodulated upon) という。
コンピュータプログラミング
コンピュータプログラミング言語においてリテラルは、ソースコード内に値を直接表記したものをいう。言語によってリテラルとして表記できる型の種類や表記方法は異なる。簡略に記述できることが好まれるスクリプティング言語はリテラルの種類が多い傾向にある。リテラル表記ができるかどうかはその型が第一級オブジェクトかどうかを検討する材料である。静的に構文解析が可能なことが多いためシンタックスハイライトではたいてい色分けされる。なお言語によっては(標準規格等で)このリテラルのことを指して「定数」という用語を使っている場合もあるが、「リテラル」という語と使い分ける場合は、「定数」とは「初期化できるだけで、その後は値を変えられない変数」というようなものを指す。
言語によってリテラルの記法はさまざまであり、プログラミングの際は基本的にその言語のリファレンスマニュアルを参考にすべきである。以下の例は全くポリシーなく任意の言語での記述例が書かれており、場合によってはどの言語における記法かも不明である。従ってプログラミングの際の参考にしてはならない。
- 数値
- 整数、浮動小数点数はほとんどの言語でサポートされる。他にも固定小数点、複素数、実数、分数などに対応する言語がある。
- 同じ種類のリテラルに対応していても言語ごとに機能面で違いがある。
- 2進法、8進法、16進法で表記できるか。また、その表記法。
0.1F
のように型を明示するためのサフィックスがあるか0.1
を.1
と整数部を省略して書けるか- 数値の間に
_
を挟めるか
- など
- 文字型
'A'
のようにシングルクォートで文字を挟み、エスケープシーケンスが使える場合が多い。ASCIIやUnicodeの1文字を表すものがある。Scheme では#\A
、#\newline
などのような記法である。SGML などではλ
、ዀ
などのような記法である。- 文字コードを表すと考えて、数値型に含める場合もある。
- 文字列型
"string"
のようにダブルクォートや、シングルクォートで文字列を囲む場合が多いが、一つの言語に複数の記述法があり、特殊な記法が用意される場合もある。その際にはエスケープシーケンスの処理を行うか、文字列補間(式展開)を行うか、文字列の終わりの解釈などがそれぞれ異なる。- また、改行やホワイトスペースをそのまま反映する文字列の記法をヒアドキュメントと呼ぶ。
- 関数
- 無名関数を表現する。クラスなどに関数が定義できるだけでは関数リテラルとはみなされない。
- 同様の機能であっても関数リテラルと呼ばない言語もある。第一級関数も参照。
- 正規表現
/regex/
のようにスラッシュで挟む。「大文字小文字を区別しない」等々のオプションが後ろに付けることができるような仕様のことが多い。- 配列
- RubyやJavaScriptなどは、
[1, 2, 3]
のようにブラケットで囲む構文。 - 連想配列
- 一例としては、
{"hoge":1 , "piyo":2}
といったように書く。 - オブジェクトリテラル
- JavaScriptではオブジェクトが属性名と属性値のペアの集まりであり、(またクラスベースではなくプロトタイプベースのオブジェクト指向であるためもあり、)前述の連想配列のようにしてオブジェクトをリテラルとして書ける。
- JavaScriptにおける、オブジェクトリテラルと、その他の基本的なデータ型(文字列と数値)の記法の組合せは、ちょっとした構造のあるデータを記述するのに便利であり、JavaScriptの構文と意味からそれらの部分だけを取り出したサブセットであるデータ記述言語のJSONがある。ダグラス・クロックフォード(en:Douglas Crockford)はJavaScriptのプログラマでJSONを広めた一人だが、「The JSON Saga」と題したプレゼンテーション[1]中で「自分はJSONと名付けたが、考案者ではなく、それ自体は“自然に”存在していたもので、早い例としては1996年にはネットスケープ・ナヴィゲータでデータ交換用に使われていた。だから“発見した”ということになるのだが、発見したのも自分が最初ではない」といったように述べている。以上のことを縮めて「JavaScriptのオブジェクト表記法からJSONが発見された。」と表現されている場合がある。
- 構造体
- (初期化)C言語のC99以降では Designated Initializer (指示付きの初期化子ないし指示初期化子)により、任意の構造体において任意のメンバの初期値について指示ができる。
- 複合リテラル (Compound Literal)
- C言語のC99以降では、Compound Literal(複合リテラル)により、配列:
(int[]){ 1, 2, 3 }
あるいは、構造体:(struct tm){ .tm_year = 107, .tm_mon = 7, .tm_mday = 24 }
といったようにして、従来はリテラルを書けなかった型のうちいくつかについて、リテラルを書けるようになった。 - null
null
、nil
- 真偽値
false
/true
、#f
/#t
- シンボル
'symbol
、:symbol
- ベクター
#(1.2 3.4 cat)
(Scheme での例)- 範囲
[1, 8)
(Synopsys IC Validator の PXL 言語での例)
例
下のコードで、7や"hello"がリテラルである。
int x = 7;
string s = "hello";
参考文献
- コンピュータ定理の証明、日本コンピュータ協会、Chin-Liang Chang, Richard Char-Tung Lee