Me preguntaba si hay algún lenguaje agradable que ofrezca algún tipo de abstracción para "pies" frente a "pulgadas" o "cm" etc. Estaba considerando hacer algo como lo siguiente en Java:preservando unidades para cálculos en la programación
u(56).feet() + u(26).inches()
y ser capaz de conseguir algo como
17.7292 metros como el resultado.
Un posible enfoque es, al crear un nuevo valor, convertirlo inmediatamente en una unidad "base", como metros o algo así, para que pueda agregarlos fácilmente.
Sin embargo, yo preferiría tener la capacidad de preservar unidades, por lo que algo como
u(799.95555).feet() - u(76).feet()
vuelve
723.95555 feet
y no
243.826452 meters - 23.1648 meters = 220.661652 meters
//220.661652 meters to feet returns 723.955551 feet
Desde este problema parece sería muy común, ¿existe algún marco o incluso un lenguaje de programación que maneje esto elegantemente?
Supongo que puedo simplemente agregar las unidades como están en mis métodos, agregando unidades coincidentes y solo convirtiendo para +-*/
[agregar/restar/multiplicar/dividir] cuando se soliciten, lo cual es genial para agregar y restar:
//A
{
this.inches = 36.2;
this.meters = 1;
}
//total length is 1.91948 m
si añado esto a un objeto B con valores
//B
{
this.inches = 0.8;
this.meters = 2;
}
//total length is 2.02032 m
y consigo un nuevo objeto que es
{
this.inches = 37;
this.meters = 3;
}
//total length is 3.9398 meters
que es totalmente increíble, puedo convertirlo siempre que no quiera ningún problema. Pero las operaciones como la multiplicación fallaría ...
//A * B = 3.87796383 m^2
{
this.inches = 28.96;
this.meters = 2;
}
// ...but multiplying piece-wise and then adding
// gives you 2.01868383 m^2, assuming you make 2m*1m give you 2 m^2.
Así que todo lo que realmente querían mostrar con ese ejemplo era que
(A1 + A2) * (Z1 + Z2) is not (A1 * Z1) + (A2 * Z2)
y estoy bastante seguro de que esto significa que uno tiene que convertir en una unidad común si quieren multiplicar o dividir.
El ejemplo fue principalmente para desalentar la respuesta reflexiva, que se suman o restan por partes antes de convertir en el último momento, ya que *
y /
fallarán.
tl; dr: ¿Hay alguna forma inteligente de conservar unidades en la programación? ¿Hay formas inteligentes de nombrar métodos/rutinas tales que me resulte fácil entender lo que estoy agregando y restando, etc.?
Frink es increíble. También se puede usar fácilmente desde Java. ¡cualquier diseñador de idiomas que logre convertir una charla en una conferencia seria en una broma de pedo de 30 minutos merece un poco de dinero gratis de StackOverflow! –