コンピュータプログラミング では、省略記号(.. または ...)は、範囲、引数の数が指定されていないこと、または親ディレクトリを示すために使用されます。ほとんどのプログラミング言語では、省略記号は一連のピリオドとして記述する必要があり、単一の(Unicode)省略記号文字は使用できません。
一部のプログラミング言語(Ada、Perl、Ruby、Apache Groovy、Kotlin、Haskell、Pascalなど)では、2つの端点を指定して値の範囲を表すために、短縮された2点省略記号が使用されます。たとえば、Perlで1から100までの整数のリストを反復処理するには、次のように記述します。
foreach (1..100)Rubyでは、...演算子は半開範囲を表します。つまり、開始値は含まれますが、終了値は含まれません。
Rustでは、演算子..=はマッチにおけるケースの包含範囲を表し、..演算子は終了値を含まない範囲を表します。
Perl と Ruby は、スカラーコンテキストで ".." 演算子をフリップフロップ演算子としてオーバーロードします。これは、状態を持つ双安定ブールテストであり、sedやAWKの "," 演算子と同様に、「x が真であるが、まだyではない」とほぼ同等です。[ 1 ]
GNU C互換コンパイラは、最初にCおよびC++言語にswitch文でcase範囲を指定できる拡張機能を提供しました。これは後にC2Yで正式にC言語に追加されました。
#include <stddef.h> #include <stdio.h> #include <uchar.h>void writeUnicode ( char32_t c ) { switch ( c ) { // [0, 0x7F] の範囲の任意の値に一致します( 0 ... 0x7Fを含む) : putchar ( c ); break ; // [0x80, 0x7FF] の範囲の任意の値に一致します (0x80 ... 0x7FF を含む) : putchar ( 0xC0 + c >> 6 ) ; putchar ( 0x80 + c & 0x3f ) ; break ; // [ 0x800, 0xFFFF] の範囲の任意の値に一致します( 0x800 ... 0xFFFF を含む) : putchar ( 0xE0 + c >> 12 ) ; putchar ( 0x80 + ( c >> 6 ) & 0x3f ); putchar ( 0x80 + ( c >> 12 )); break ; default : unreachable (); } }さらに、GNU C では、C 言語でのみ利用可能な指定初期化子に対して同様の範囲構文が使用できます。
int nums [ 10 ] = { [ 0. . .5 ] = 1 };Delphi / Turbo Pascal / Free Pascal:
var FilteredChars : set of [ #0 .. #32 , #127 , 'a' .. 'z' ] ; var CheckedItems : set of [ 4 , 10 .. 38 , 241 , 58 ] ;統一モデリング言語(UML)では、2 文字の省略記号を使用して、関連付けの可変カーディナリティを示します。たとえば、カーディナリティが 1..* の場合、関連付けに集約される要素の数は 1 から無限大まで変化します (クリーネプラスと同等の使い方)。
Windows や Unix 系オペレーティングシステムでは、「..」はパス内の親ディレクトリにアクセスするために使用されます。
Perl [ 2 ]とRaku [ 3 ] では、3 文字の省略記号は「ヤダヤダヤダ」演算子としても知られており、言語的な意味と同様に、後で挿入されるコードの「代用」として機能します。
Python(プログラミング言語)(Python 3以降)では、3文字の省略記号を、後で挿入するコードの表現力豊かなプレースホルダーとして使用することもできます。
抽象構文記法1 (ASN.1)では、省略記号は拡張マーカーとして使用され、プロトコル仕様の将来の改訂で型拡張が可能であることを示せます。型制約式では、省略記号は拡張ルートと拡張追加を区切るために使用されます。バージョン1システムにおける型Aの定義(形式)とバージョン2システムにおける型Aの定義(形式)は、同じ仕様の異なるバージョンにおける同じ型Aの拡張シリーズを構成します。省略記号は、複合型定義において、拡張ルートに属するフィールドのセットと拡張追加を構成するフィールドのセットを区切るためにも使用できます。以下に例を示します。A ::= INTEGER (0..127, ..., 256..511)A ::= INTEGER (0..127, ...)A ::= INTEGER (0..127, ..., 256..511)B::=SEQUENCE{aINTEGER,bINTEGER,...,cINTEGER}
CおよびC++プログラミング言語では、省略記号は関数の可変個のパラメータを表すために使用されます。これらのC スタイルの可変引数パラメータは型安全ではなく、渡された可変引数の型に関する情報をキャプチャしないため、型に格納し、、、などのマクロを使用して読み取る必要がありますva_list。[ 4 ]例: [ 5 ]va_start()va_arg()va_end()
int printf ( const char * fmt , ...);上記のC言語の関数は、次のような異なる型と数のパラメータで呼び出すことができます。
// "numbers 5 10 15" と出力しますprintf ( "numbers %i %i %i" , 5 , 10 , 15 );// "入力文字列、別の文字列、0.5" と出力しますprintf ( "入力文字列 %s、%f" , "別の文字列" , 0.5 );C99では可変数の引数を持つマクロが導入されました。[ 6 ]
C++11には、 C99プリプロセッサで導入された新しい可変引数マクロ機能[ 7 ]が含まれており、可変数の引数を持つテンプレート(可変引数テンプレートと呼ばれる)も導入されました。これは、C++で型安全な可変引数パラメータを実装する方法です。[ 8 ]
std :: string_viewを使用します。template < typename ... Args > void myPrintf ( string_view fmt , Args ... parameters );Javaはバージョン1.5以降、この「可変引数」機能を採用しています。例:
public int func ( int num , String ... names );これは実際には に変換されますString[] namesが、配列でラップする必要はありません。
PHP 5.6 では、明示的に可変引数関数を定義するために省略記号の使用がサポートされています[ 9 ]。関数定義内の引数の前に省略記号があると、その時点以降の引数が配列に収集されます。例:...
function variadic_function ( $a , $b , ... $other ) { return $other ; }var_dump ( variadic_function ( 1 , 2 , 3 , 4 , 5 ));次のような出力が得られます。
配列( 3 ) { [ 0 ] => int ( 3 ) [ 1 ] => int ( 4 ) [ 2 ] => int ( 5 ) }R4RSsyntax-rulesで最初に導入された衛生的なマクロシステムは、次のパターンが0回以上一致する可能性があることを指定するために使用されます。たとえば、次のコードは、標準形式をそれ自身に関して再帰的に実装し、より原始的な形式を実装するために使用できます。...let*let
( define-syntax let* ( syntax-rules () (( let* () body1 body2 ... ) ( let () body1 body2 ... )) (( let* (( name1 val1 ) ( name2 val2 ) ... ) body1 body2 ... ) ( let (( name1 val1 )) ( let* (( name2 val2 ) ... ) body1 body2 ... )))))SRFI 46 [ 10 ]では、省略記号識別子をユーザーが指定できるように拡張することが提案されましたsyntax-rules。これは、省略記号がネストされたマクロ定義で使用されている場合に曖昧さを解消するのに役立ちます。この機能は後に R7RS に組み込まれました。
Pythonでは、省略記号はEllipsis単一要素を表す空項式です。
これは特にNumPyで使用され、高次元配列の任意の数の次元をスライスするために省略記号が使用されます。[ 11 ]
import numpy as np from typing import NDArrayt : NDArray [ int ] = np 。ランダム。ランド( 2 、3 、4 、5 )# 最後の次元から最初の要素を選択し、残りをコピーします( 2 , 3 , 4 ) t [ ... , 0 ] . shape# 最初の次元から最初の要素を選択し、残りをコピーします( 3 , 4 , 5 ) t [ 0 , ... ] . shapeMATLABでは、行の継続を示すために3文字の省略記号が使用され、[ 12 ]行のシーケンスが
x = [ 1 2 3 ...4 5 6 ];意味的には単一の行と同等
x = [ 1 2 3 4 5 6 ];Rakuでは、フォーマット文字列内のマーカーの一種として、実際のUnicode (U+2026)省略記号(…)文字が使用されています。 [ 13 ]
PHP 8.1以降、nullary省略記号を使用して、呼び出し可能オブジェクトまたはオブジェクトメソッドからクロージャを作成できます。 [ 14 ]
// 旧スタイル: PHP 8.0 以前$foo = [ $this , 'foo' ]; $fn = Closure :: fromCallable ( 'strlen' );// 新しいスタイル: PHP 8.1 以降$foo = $this -> foo ( ... ); $fn = strlen ( ... );collections.abc.CallablePythonでは、省略記号は型注釈内の最初のパラメータとして任意の数の引数を表すためにも使用できます。 [ 15 ]
from collections.abc import Callable from typing import TypeAlias , AnyVarFunction : TypeAlias = Callable [ ... , Any ]