この項目では、数理論理学とコンピュータプログラミングにおける学術用語について説明しています。eufonius の楽曲については「リテラル (曲) 」をご覧ください。
リテラル ・直値 [ 1] [ 2] [ 3] (英 : literal )は、「文字どおり」「字義どおり」を意味する語で、letter と同じくラテン語 の littera (文字 )に由来する。数理論理学 とコンピュータプログラミング[ 4] で異なる意味の専門用語 として使われる[ 5] 。
数理論理学
リテラルとは、数理論理学 において、原子論理式 あるいは原子論理式の否定 のこと。
基礎リテラル とは、リテラルのうち、変数 を含んでいないものを指す。
共通な変数を持たない2つの節に対して、節のそれぞれのリテラルで使って再汎単一化要素をもち、二次元導出系 (英 : binary resolvant ) を作る場合に導出に使われたリテラル (英 : literal resolved upon ) と呼ぶ。共通の変数を含まない2つの節で、推論した節の二次元等号調整系 (英 : binary paramodulant ) を作ったとき、等号調整に使われたリテラル (英 : literal paramodulated upon ) という。
コンピュータプログラミング
コンピュータ プログラミング言語 においてリテラルは、ソースコード 内に値 を直接表記したものをいう。言語によってリテラルとして表記できる型 の種類や表記方法は異なる。簡略に記述できることが好まれるスクリプティング言語 はリテラルの種類が多い傾向にある。リテラル表記ができるかどうかはその型が第一級オブジェクト かどうかを検討する材料にもなるが、必ずしもそうとは限らない[ 注釈 1] 。静的に構文解析が可能なことが多いためシンタックスハイライト ではたいてい色分けされる。なお言語によっては(標準規格等で)このリテラルのことを指して「定数」という用語を使っている場合もあるが、「リテラル」という語と使い分ける場合は、「定数 」とは「初期化できるだけで、その後は値を変えられない変数」というようなものを指す。
数値
整数、浮動小数点数 はほとんどの言語でサポートされる。他にも固定小数点 数、複素数、実数、分数などに対応する言語がある。
同じ種類のリテラルに対応していても言語ごとに機能面で違いがある。以下に挙げるのはその代表的なもの。
10進法以外に、2進法、8進法、16進法で表記できるか。また、その表記法。
0.1F
のように型を明示するためのサフィックスがあるか。
0.1
を .1
と整数部を省略して書けるか。
数値の間に桁区切りとして _
などを挟めるか[ 注釈 2] 。
文字型
'A'
のようにシングルクォート で文字を挟み、また改行文字の'\n'
のようにエスケープシーケンス が使える場合が多い。C/C++の従来の文字リテラルは標準規格でエンコーディングが規定されていないが、多くの処理系ではASCII に準ずる。ワイド文字 やUnicode の1文字を表すものもある[ 注釈 3] 。LISP 系言語(Scheme など)では #\A
、#\newline
などのような記法である。
文字コードを表すと考えて、数値型(整数型)に含める場合もある。多くの言語では文字リテラルは文字型を持つが、Cの文字リテラル(規格上の用語では文字定数)はchar
型ではなくint
型である[ 6] 。専用の文字型を持たず、長さ1の文字列を文字として扱い、リテラルも区別しないという言語もある。
文字列型 (文字列リテラル)
"this is a string literal"
のようにダブルクォート や、シングルクォートで文字列を囲む場合が多いが、一つの言語に複数の記述法があり、特殊な記法が用意される場合もある。その際にはエスケープシーケンスの処理、文字列補間 (式展開)の有無、文字列の終わりの解釈などがそれぞれ異なる。C/C++の文字列はヌル終端文字列 だが、厳密な意味での文字列リテラルは存在せず、実際には末尾要素としてヌル文字 を含む固定長の文字配列型である[ 7] 。
また、改行 やホワイトスペース をそのまま反映する文字列リテラルの記法をヒアドキュメント と呼ぶ。特にプログラミング言語のソースコード内にスクリプト言語やデータ記述言語のソースコードを文字列として記述したり、正規表現を文字列として記述したりするときに便利である。C++11 では生の文字列リテラル (raw string literal) と呼ばれる。C# ではもともと逐語的文字列リテラル (verbatim string literal) と呼ばれる機能が備わっていたが、C# 11ではさらにダブルクォートのエスケープも不要となる生文字列リテラルの機能が追加された[ 8] 。
関数
関数リテラルは関数を第一級オブジェクト として扱える言語に備わっている。
無名関数 (ラムダ式)を表現する。クラスなどに関数が定義できるだけでは関数リテラルとはみなされない。
同様の機能であっても関数リテラルと呼ばない言語もある。第一級関数 も参照。
正規表現
/regex/
のようにスラッシュで挟む。「大文字小文字を区別しない」等々のオプションが後ろに付けることができるような仕様であることが多い[要説明 ] 。
配列
配列のリスト初期化構文をサポートする言語は多いが、配列のリテラルをサポートしているとは限らない。
C言語 をはじめとするC系の言語では、{1, 2, 3}
のように要素をコンマで区切り、ブレース で囲む。ただしC/C++では、この記法は「初期化子リスト」であり、配列のリテラルではない[ 注釈 4] 。Java では「配列初期化子」[ 9] 、C# では「コレクション初期化子」[ 10] であり、ともに配列のリテラルではない。
Ruby やJavaScript などは、[1, 2, 3]
のようにブラケット で囲む。
Python はリストのリテラル[1, 2, 3]
、タプルのリテラル(1, 2, 3)
、セットのリテラル{1, 2, 3}
をサポートするが、配列(数値用のコンパクトなコレクション表現)のリテラルはサポートしない[ 11] 。
OCaml およびF# は配列のリテラル([| 1; 2; 3 |]
など)[ 12] およびリストのリテラル([ 1; 2; 3 ]
など)[ 13] をサポートする。
Go は[3]int{1, 2, 3}
のように要素数と型を指定することで配列(固定長のコレクション)のリテラルとなる。[]int{1, 2, 3}
のように要素数を省略するとスライス(可変長のコレクション)のリテラルとなる[ 14] 。
連想配列
一例としては、{"hoge":1, "piyo":2}
といったように書く。このように書いた場合は、キーが"hoge"で値が1のペアと、キーが"piyo"で値が2のペアの配列を示す。言語によって [要出典 ] キーと値の間の記号が=>
や->
であることがある[要説明 ] 。
オブジェクトリテラル
JavaScriptではオブジェクトが属性名と属性値のペアの集まりであり、前述の連想配列のようにしてオブジェクトをリテラルとして書ける[ 注釈 5] 。
JavaScriptにおけるオブジェクトリテラルと、その他の基本的なデータ型(文字列と数値と真理値)のリテラル記法の組み合わせは、階層構造を持つデータを記述するのに便利である。データ記述言語 のひとつに、JavaScriptの構文と意味からリテラルの部分だけを取り出したサブセットとして規格化されたJSON がある。
構造体 (レコード )
構造体のリスト初期化や指示付き初期化の構文をサポートする言語は多いが、構造体のリテラルをサポートしているとは限らない。
C言語のC99 規格以降では、designated initializer(指示付き初期化子または指示初期化子)のサポートにより、任意の構造体において任意のメンバの初期値について指示ができる。C++20 規格でも同様の指示付き初期化機能のサブセットが導入された[ 15] 。
複合リテラル (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 規格以降では、演算子オーバーロードによりプログラマが任意の型のリテラルを定義できるようになった[ 16] 。
null
null
、nil
、nullptr
真偽値
false
/true
、#f
/#t
シンボル
'symbol
、:symbol
ベクター
#(1.2 3.4 cat)
(Scheme での例)
範囲
[1, 8)
(Synopsys IC Validator の PXL 言語での例)
例
下のC#コードにおいて、7
, 3.14
, true
, "hello"
がそれぞれの型のリテラルである。
int x = 7 ;
double pi = 3.14 ;
bool flag = true ;
string s = "hello" ;
C#ではリテラルもオブジェクトであり、以下のようにメソッド を呼び出すこともできる。
using System ;
Console . WriteLine ( 7. GetType ());
Console . WriteLine ( 3.14 . GetType ());
Console . WriteLine ( true . GetType ());
Console . WriteLine ( "hello" . GetType ());
出力結果は以下のようになる(C#の組み込み型は、.NETのCLR 型へのエイリアスである)。
System.Int32
System.Double
System.Boolean
System.String
参考文献
Chang, Chin-Liang、Lee, Richard Char-Tung 著、長尾真、辻井潤一 訳『コンピュータ定理の証明』 27巻、日本コンピュータ協会 (編)〈コンピュータ・サイエンス研究書シリーズ〉、1983年9月。 NCID BN00844314 。全国書誌番号 :85013050 。 原書: Symbolic Logic and Mechanical Theorem Proving[ 17]
脚注
注釈
出典
関連項目