En programación informática , la notación de puntos suspensivos (.. o ...) se utiliza para indicar rangos , un número indeterminado de argumentos o un directorio padre. La mayoría de los lenguajes de programación requieren que los puntos suspensivos se escriban como una serie de puntos; no se puede utilizar un solo carácter de puntos suspensivos ( Unicode ).
Rangos
En algunos lenguajes de programación (incluidos Ada , Perl , Ruby , Apache Groovy , Kotlin , Haskell y Pascal ), se utiliza una elipsis de dos puntos abreviada para representar un rango de valores dados dos puntos extremos; por ejemplo, para iterar a través de una lista de enteros entre 1 y 100 inclusive en Perl:
foreach (1..100)
En Ruby, el ...operador denota un rango semiabierto, es decir, que incluye el valor inicial pero no el valor final.
En Rust, el ..=operador denota un rango inclusivo para los casos en coincidencias y el ..operador representa un rango que no incluye el valor final.
Perl y Ruby sobrecargan el operador ".." en contexto escalar como un operador biestable : una prueba booleana con estado , aproximadamente equivalente a "verdadero mientras x pero aún no y ", de forma similar al operador "," en sed y AWK . [ 1 ]
Los compiladores compatibles con GNU C proporcionaron inicialmente una extensión al lenguaje C y C++ para permitir rangos de casos en las sentencias switch . Posteriormente, esto se añadió oficialmente a C en C2Y .
#include <stddef.h> #include <stdio.h> #include <uchar.h>void writeUnicode ( char32_t c ) { switch ( c ) { // coincide con cualquier valor entre [0, 0x7F] inclusive case 0 ... 0x7F : putchar ( c ); break ; // coincide con cualquier valor entre [0x80, 0x7FF] inclusive case 0x80 ... 0x7FF : putchar ( 0xC0 + c >> 6 ); putchar ( 0x80 + c & 0x3f ); break ; // coincide con cualquier valor entre [0x800, 0xFFFF] inclusive case 0x800 ... 0xFFFF : putchar ( 0xE0 + c >> 12 ); putchar ( 0x80 + ( c >> 6 ) & 0x3f ); putchar ( 0x80 + ( c >> 12 )); break ; default : unreachable (); } }Además, GNU C permite una sintaxis de rango similar para inicializadores designados , disponible solo en el lenguaje C:
int nums [ 10 ] = { [ 0. . .5 ] = 1 };Delphi / Turbo Pascal / Free Pascal:
var FilteredChars : conjunto de [ #0 .. #32 , #127 , 'a' .. 'z' ] ; var CheckedItems : conjunto de [ 4 , 10 .. 38 , 241 , 58 ] ;En el Lenguaje Unificado de Modelado (UML), se utilizan puntos suspensivos de dos caracteres para indicar la cardinalidad variable de una asociación. Por ejemplo, una cardinalidad de 1..* significa que el número de elementos agregados en una asociación puede variar de 1 a infinito (un uso equivalente a Kleene plus ).
Directorio principal
En Windows y sistemas operativos tipo Unix, ".." se utiliza para acceder al directorio padre en una ruta .
Código incompleto
En Perl [ 2 ] y Raku [ 3 ] los puntos suspensivos de 3 caracteres también se conocen como el operador "yada yada yada" y, de manera similar a su significado lingüístico , sirven como un "sustituto" para el código que se insertará más tarde.
Python (lenguaje de programación) (a partir de Python 3) también permite utilizar los puntos suspensivos de 3 caracteres como un marcador de posición expresivo para insertar código posteriormente.
En la Notación de Sintaxis Abstracta Uno (ASN.1), los puntos suspensivos se utilizan como marcador de extensión para indicar la posibilidad de extensiones de tipo en futuras revisiones de una especificación de protocolo. En una expresión de restricción de tipo como los puntos suspensivos se utilizan para separar la raíz de la extensión de las adiciones de extensión. La definición del tipo A en el sistema de la versión 1 de la forma y la definición del tipo A en el sistema de la versión 2 de la forma constituyen una serie de extensión del mismo tipo A en diferentes versiones de la misma especificación. Los puntos suspensivos también se pueden utilizar en definiciones de tipos compuestos para separar el conjunto de campos que pertenecen a la raíz de la extensión del conjunto de campos que constituyen las adiciones de extensión. He aquí un ejemplo:A ::= INTEGER (0..127, ..., 256..511)A ::= INTEGER (0..127, ...)A ::= INTEGER (0..127, ..., 256..511)B::=SEQUENCE{aINTEGER,bINTEGER,...,cINTEGER}
Número variable de parámetros
C y C++
En los lenguajes de programación C y C++ , se utiliza una elipsis para representar un número variable de parámetros de una función . Estos parámetros variádicos al estilo C no son seguros en cuanto a tipos, ya que no capturan ninguna información sobre los tipos de los argumentos variádicos pasados, y deben almacenarse en un va_listtipo y leerse mediante macros como va_start(), va_arg(), y va_end(). [ 4 ] Por ejemplo: [ 5 ]
int printf ( const char * fmt , ...);La función anterior en C podría entonces ser llamada con diferentes tipos y cantidades de parámetros, tales como:
// imprime "números 5 10 15" printf ( "números %i %i %i" , 5 , 10 , 15 );// imprime "cadena de entrada otra cadena, 0.5" printf ( "cadena de entrada %s, %f" , "otra cadena" , 0.5 );C99 introdujo macros con un número variable de argumentos . [ 6 ]
C++11 incluyó las nuevas características de macros variádicas introducidas en el preprocesador C99, [ 7 ] y también introdujo plantillas con un número variable de argumentos, llamadas plantillas variádicas , que son la forma en que se implementan los parámetros variádicos con seguridad de tipos en C++. [ 8 ]
usando std :: string_view ;plantilla < typename ... Args > void myPrintf ( string_view fmt , Args ... parameters );Java
A partir de la versión 1.5, Java ha adoptado esta funcionalidad de "varargs". Por ejemplo:
public int func ( int num , String ... names );Esto en realidad se convierte en String[] names, pero no es necesario que esté envuelto en una matriz.
PHP
PHP 5.6 admite [ 9 ] el uso de puntos suspensivos para definir una función explícitamente variádica , donde ...antes de un argumento en la definición de una función significa que los argumentos a partir de ese punto se recopilarán en un array. Por ejemplo:
función función_variádica ( $a , $b , ... $other ) { return $other ; }var_dump ( función_variable ( 1 , 2 , 3 , 4 , 5 ));Produce este resultado:
array ( 3 ) { [ 0 ] => int ( 3 ) [ 1 ] => int ( 4 ) [ 2 ] => int ( 5 ) }Esquema
El syntax-rulessistema de macros higiénicas introducido originalmente en R4RS se utiliza ...para especificar que el patrón siguiente puede coincidir cero o más veces. Por ejemplo, el siguiente código podría utilizarse para implementar la let*forma estándar, recursivamente en términos de sí misma, y la más primitiva 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 ] propuso una extensión syntax-rulespara permitir al usuario especificar un identificador de puntos suspensivos. Esto resulta útil para evitar ambigüedades cuando se utilizan puntos suspensivos en definiciones de macros anidadas. Esta función se incluyó posteriormente en R7RS.
Múltiples dimensiones
En Python , los puntos suspensivos son una expresión nula que representa un Ellipsissingleton.
Se utiliza particularmente en NumPy , donde se utiliza una elipsis para segmentar un número arbitrario de dimensiones para una matriz de alta dimensión: [ 11 ]
import numpy as np from typing import NDArrayt : NDArray [ int ] = np . aleatorio . rand ( 2 , 3 , 4 , 5 )# selecciona el primer elemento de la última dimensión, copia el resto ( 2 , 3 , 4 ) t [ ... , 0 ] . forma# selecciona el primer elemento de la primera dimensión, copia el resto ( 3 , 4 , 5 ) t [ 0 , ... ] . formaOtras semánticas
MATLAB
En MATLAB , se utiliza una elipsis de tres caracteres para indicar la continuación de la línea , [ 12 ] haciendo que la secuencia de líneas
x = [ 1 2 3 ...4 5 6 ];
semánticamente equivalente a la línea única
x = [ 1 2 3 4 5 6 ];
En Raku , se utiliza un carácter de puntos suspensivos Unicode (U+2026) real (…) para servir como una especie de marcador en una cadena de formato. [ 13 ]
PHP
Desde PHP 8.1, se puede usar una elipsis nula para crear un cierre a partir de un método invocable o de un objeto: [ 14 ]
// estilo antiguo: PHP 8.0 y anteriores $foo = [ $this , 'foo' ]; $fn = Closure :: fromCallable ( 'strlen' );// nuevo estilo: PHP 8.1 y posteriores $foo = $this -> foo ( ... ); $fn = strlen ( ... );Pitón
En Python, los puntos suspensivos también se pueden usar como primer parámetro dentro de la collections.abc.Callableanotación de tipo para denotar cualquier número de argumentos: [ 15 ]
from collections.abc import Callable from typing import TypeAlias , AnyVarFunction : TypeAlias = Callable [ ... , Any ]Referencias
- ↑ perlop - perldoc.perl.org
- ↑ "Perlsyn - Sintaxis de Perl - Navegador de Perldoc" .
- ↑ "Operadores" .
- ↑ "<cstdarg> (stdarg.h) - Referencia de C++" . www.cplusplus.com . Archivado del original el 31/10/2012 . Consultado el 02/10/2007 .
- ↑ "Printf - Referencia de C++" .
- ↑ Macros variádicas: uso de la colección de compiladores GNU (GCC)
- ↑ Cambios en el borrador de trabajo para la sincronización del preprocesador C99 - http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1653.htm
- ↑ "Borrador de trabajo, estándar para el lenguaje de programación C++" (PDF) .: 14.5.3 Plantillas variádicas
- ↑ "PHP: RFC:variadics" .
- ↑ "SRFI 46" .
- ↑ "Rutinas de indexación — Manual de NumPy v1.22" .
- ↑ "Mathworks.com" . Archivado del original el 29 de junio de 2011. Consultado el 14 de abril de 2011 .
- ↑ Conway, Damian (29-05-2006) [26-02-2004]. Wall, Larry (ed.). "Exégesis 7: Formatos" . dev.perl.org . 2. Archivado del original el 15-06-2011.
- ↑ "Anuncio de lanzamiento de PHP 8.1.0" . php.net . Consultado el 29 de marzo de 2023 .
- ↑ "typing — Soporte para sugerencias de tipo § typing.Callable" . Documentación de Python 3.11.2 . Consultado el 29 de marzo de 2023 .
- Operadores (programación)