programming-languages - the - top 3 programming languages
¿Hay algún idioma que permita unidades? (24)
Bueno, la biblioteca ActiveSupport para ruby extiende la clase Integer con métodos como horas y días, lo que le permite escribir cosas como:
Time.now + 5.days
Pero esa no es realmente una característica de sintaxis, es solo una llamada de método y es posible en cualquier idioma que le permita agregar métodos a una clase existente. Podría hacerlo en C # con métodos de extensión, aunque tendría que ser 5.days()
allí.
Al escribir lo siguiente hoy en C #
DateTime.Now.AddYears(-60)
Me pregunté si hay algún idioma que permita una sintaxis más natural con unidades:
DateTime.Now - 60years
¿Alguien sabe de alguno? Específicamente, estoy interesado en la presencia de operadores de unidades (?) Que convierten "60 años" en, por ejemplo, "TimeSpan.FromYears (60)". También sería bueno poder definir sus propios operadores de unidad, de manera similar a cómo puede escribir operadores de conversión en C #
(Sí, sé que TimeSpan no hace años, es un ejemplo).
Cuando usas unidades, en realidad estás asignando un tipo. Las conversiones se podrían implementar a través de la conversión, o mediante la diferenciación de llamadas a funciones basadas en tipos de parámetros (sobrecarga de funciones). Casi cualquier lenguaje tipificado estáticamente (que le permite definir tipos a fondo) le permitiría hacer algo similar. Haría que su programa fuera más sólido, aunque aquellos que prefieren lenguajes de tipo dinámico pueden argumentar que las ganancias son pequeñas en relación con el tiempo empleado en implementar un sistema de tipo tan completo para la mayoría de las aplicaciones. Construir un Mars Climate Orbiter , por otro lado, merecería un sistema de este tipo.
La sintaxis es un poco diferente, pero su ejemplo me parece muy similar a los ejemplos comunes de cómo algunos usarían el sistema de tipos de Haskell (o el de cualquier lenguaje funcional tipificado), aunque, como mencioné, esto también es factible en C-like idiomas también
El nuevo lenguaje de Sun Fortress admite unidades y, si la memoria sirve, es lo suficientemente inteligente como para evitar que haga cosas extrañas, como restar medidas de tiempo de medidas de longitud.
Y Mathematica tiene unidades de medida y una sintaxis no demasiado difícil de manejar para manejarlas.
En Perl, puedes usar DateTime que permite cosas como:
my $dt = DateTime->now
$dt->subtract( hours => 1 );
Estoy seguro de que no es lo que está buscando, pero en el área de los equipos de prueba y medición, no sería inusual que un ''programa de prueba'' incluya declaraciones que operan en valores expresados con voltaje, corriente o unidades de tiempo.
Cosas muy especializadas, sin embargo, y apenas reconocibles por la mayoría como lenguajes de programación.
F # tiene unidades de medida. Algunos ejemplos de
Hay una biblioteca Boost C ++ para Unidades que hace un uso extensivo de la metaprogramación de plantillas para proporcionar algo similar a la sintaxis que desea.
quantity<force> F(2.0*newton);
quantity<length> dx(2.0*meter);
quantity<energy> E(work(F,dx));
http://www.boost.org/doc/libs/1_37_0/doc/html/boost_units.html
La biblioteca de Java JODA funciona de esa manera.
Y hay JSR-275 que propone un marco de unidades.
La primera vez que escuché sobre este problema en 1997 fue de Martin Fowler. Escribió sobre ello en sus "Patrones de análisis" .
La función strtotime () de PHP lo hace muy bien. Toma una cadena y un tiempo opcional como parámetros y la analizará para averiguar una nueva hora.
Ejemplos:
$newTime = strtotime(''last monday'');
$newTime = strtotime(''- 2 days'', $originalTime);
$newTime = strtotime(''- 60 years'', $originalTime);
$newTime = strtotime(''+ 1 week 1 day'', $originalTime);
Más aquí: http://us2.php.net/strtotime
MySQL tiene esta característica
mysql> SELECT ''2008-12-31 23:59:59'' + INTERVAL 1 SECOND;
-> ''2009-01-01 00:00:00''
mysql> SELECT INTERVAL 1 DAY + ''2008-12-31'';
-> ''2009-01-01''
mysql> SELECT ''2005-01-01'' - INTERVAL 1 SECOND;
-> ''2004-12-31 23:59:59''
No es parte del lenguaje, pero he visto eso hecho antes en C, algo como:
#define NOW time(0)
#define PLUS +
#define AND +
#define MINUS -
#define SECOND * 1
#define SECONDS * 1
#define MINUTE * 60
#define MINUTES * 60
#define HOUR * 3600
#define HOURS * 3600
#define DAY * 86400
#define DAYS * 86400
time_t waitUntil = NOW PLUS 1 HOUR AND 23 MINUTES;
Me pareció una abominación en ese momento, en la misma clase que "#define begin {"
y "#define end }"
; si no te gusta la forma en que funciona el idioma, usa un idioma diferente; No intentes someterlo a tu voluntad de una manera tan horrible.
Todavía parece una abominación, pero me he suavizado en mi vejez y al menos puedo entender por qué tal vez alguien pensó que era una buena idea.
No he visto un lenguaje que lo soporte inherentemente. Sin embargo, ciertamente puede escribir sus propios objetos basados en la fecha en una variedad de idiomas, si así lo desea.
No unidades, per se ... sino una forma de usar métodos de extensión para darle funcionalidad de unidad. Este ejemplo es para TimeSpan, específicamente.
static class TimeExtensions
{
public static TimeSpan ToDays(this int i)
{
return new TimeSpan(i, 0, 0, 0, 0);
}
public static TimeSpan ToHours(this int i)
{
return new TimeSpan(0, i, 0, 0, 0);
}
public static TimeSpan ToMinutes(this int i)
{
return new TimeSpan(0, 0, i, 0, 0);
}
public static TimeSpan ToSeconds(this int i)
{
return new TimeSpan(0, 0, 0, i, 0);
}
public static TimeSpan ToMilliseconds(this int i)
{
return new TimeSpan(0, 0, 0, 0, i);
}
}
Luego, simplemente 4. ToMinutes () te da un intervalo de tiempo de 4 minutos. Si tiene clases base similares con las que trabajar para representar otros tipos de unidades, se puede agregar el mismo tipo de funcionalidad de extensión.
(Nota: esto es simplemente una representación en C # del ejemplo de Ruby.)
PowerShell tiene algún soporte básico. Por ejemplo, 5GB/1MB
evalúa a 5120
Sé lo que quieres decir, y yo también he sentido curiosidad por esto. (Mi profesor de química de la escuela secundaria estaba convencido de que los números sin unidades carecían de sentido. De todos modos ...)
Con cualquier lenguaje fuertemente tipado, puede escribir clases para estos conceptos. Los he escrito en C ++, Java y Pascal. "Unidades" y "Java" de Google, y puedes encontrar una biblioteca que tiene todo tipo de medidas físicas encapsuladas de esta manera.
C ++, con sus conversiones de tipo más pulido y la sobrecarga de operadores puede hacer que esto parezca más natural. De hecho, puedes hacer que las cosas sean bastante hábiles, llegando a lo que creo que quieres. Java, aunque lo hace, requerirá conversiones más explícitas y una sintaxis incómoda.
Pero no, no lo he visto.
Busque lenguajes específicos de dominio creados para científicos, incluso "educativos".
SQL, o al menos MySQL tiene alguna unidad básica basada en el tiempo.
mysql> SELECT DATE_SUB(NOW(), INTERVAL 1 DAY) AS `yesterday`, NOW() + INTERVAL 1 DAY AS `tomorrow`;
+---------------------+---------------------+
| yesterday | tomorrow |
+---------------------+---------------------+
| 2009-08-20 06:55:05 | 2009-08-22 06:55:05 |
+---------------------+---------------------+
1 row in set (0.00 sec)
Sintácticamente, no estoy realmente seguro de cuál sería el beneficio.
DateTime.Now + 60 years
Terminado
DateTime.Now.AddYears (60)
Mi método típico para tratar con "unidades" es definir constantes que convierten esas unidades en la unidad base del objeto de datos si se multiplican. Dado que alguien (breve) etiquetó esto con Ada, la versión de Ada sería:
Years : constant := 60.0 * 60.0 * 24.0 * 365.0;
DateTime.Now := DateTime.Now + (60.0 * Years);
Creo que puedes hacer prácticamente lo mismo en C ++, excepto que los objetos de tiempo pueden ser enteros grandes en lugar de reales.
Supongo que C ++, puede crear una clase de unidad con operadores sobrecargados y algunas macros #define
Usted podría estar interesado en F # http://blogs.msdn.com/andrewkennedy/archive/2008/08/20/units-of-measure-in-f-part-one-introducing-units.aspx apoyo
Vea la respuesta en C # Extensions donde la clase int se extiende para admitir métodos como horas (), días (), etc.
Powershell tiene los operadores kB, MB y GB para manejar los tamaños de archivos, etc.
La función DATE_ADD () en MSSQL acepta unidades tales como día, hora, etc. para la aritmética de fecha.
Frink es un lenguaje creado específicamente para "cálculos físicos" como ese. De la documentación:
Frink es una herramienta de cálculo práctica y un lenguaje de programación diseñado para simplificar los cálculos físicos, a fin de garantizar que las respuestas salgan bien [..]. Realiza un seguimiento de las unidades de medida (pies, metros, kilogramos, vatios, etc.) a través de todos los cálculos, lo que le permite mezclar unidades de medida de forma transparente [..]
Tu ejemplo en Frink:
now[] - 60 years
Unum hace exactamente eso para Python, permitiendo códigos como:
>>> TON + 500*KG
1.5 [t]
>>> 5E-8*M - 28*ANGSTROM
472.0 [angstrom]
>>> 3*H + 20*MIN + 15*S
3.3375 [h]
>>> H == 60*MIN
True
>>> 10000*S > 3*H + 15*MIN
False
>>>
Ada y su prima, VHDL, apoyan directamente el concepto de unidades. Dado que estos lenguajes son extremadamente tipificados, las unidades son una habilidad natural del rigor de los tipos.