Programming languages 有允许使用单位的语言吗?

Programming languages 有允许使用单位的语言吗?,programming-languages,syntax,Programming Languages,Syntax,今天在用C写以下内容时# 我想知道是否有任何语言允许更自然的单位语法: DateTime.Now - 60years 有人知道吗?具体来说,我感兴趣的是,是否存在将“60年”转换为例如“TimeSpan.FromYears(60)”的单位运营商(?)。能够定义自己的单位运算符也很好,就像在C中编写转换运算符一样# (是的,我知道TimeSpan多年来不迎合它——这是一个例子) < p> i GueC++,你可以在Perl中用重载操作符和一些定义宏的< /P> < p>来制作单元类,你可以用它来

今天在用C写以下内容时#

我想知道是否有任何语言允许更自然的单位语法:

DateTime.Now - 60years
有人知道吗?具体来说,我感兴趣的是,是否存在将“60年”转换为例如“TimeSpan.FromYears(60)”的单位运营商(?)。能够定义自己的单位运算符也很好,就像在C中编写转换运算符一样#


(是的,我知道TimeSpan多年来不迎合它——这是一个例子)

< p> i GueC++,你可以在Perl中用重载操作符和一些定义宏的< /P> < p>来制作单元类,你可以用它来允许:
my $dt = DateTime->now
$dt->subtract( hours => 1 );

我从未见过这样一种语言天生支持它。但是,如果您愿意,您当然可以用多种语言编写自己的基于日期的对象。

Java的库就是这样工作的

这就提出了一个单元框架


我在1997年从马丁·福勒那里第一次听到这个问题。他在他的文章中写到了这一点。

那么,ruby的ActiveSupport库使用hours和days等方法扩展了Integer类,允许您编写以下内容:

Time.now + 5.days

但这并不是一个真正的语法特性——它只是一个方法调用,在任何允许向现有类添加方法的语言中都是可能的。你可以用C#和扩展方法来做这件事——尽管它必须在那里
5.days()

我不知道是否存在,但我希望在未来几年内开始看到像s这样的东西出现。我的想法有点像是下一代什么的。我敢肯定,这些东西有大量的数学、科学和工程用途。

我敢肯定,这不是你想要的,但在测试和测量设备领域,“测试程序”包括以电压、电流或时间单位表示的值进行操作的语句并不少见


非常专业化的东西,大多数编程语言都难以识别。

< P>有一个Boost C++库,它可以广泛地使用模板元编程来提供与你想要的语法类似的东西。
quantity<force>     F(2.0*newton);
quantity<length>    dx(2.0*meter);
quantity<energy>    E(work(F,dx));
数量F(2.0*牛顿);
数量dx(2.0*米);
数量E(工程量(F,dx));
PHP的strotime()函数做得非常好。它将一个字符串和一个可选的时间作为参数,并将解析该字符串以计算出一个新的时间

示例:

 $newTime = strtotime('last monday');
 $newTime = strtotime('- 2 days', $originalTime);
 $newTime = strtotime('- 60 years', $originalTime);
 $newTime = strtotime('+ 1 week 1 day', $originalTime);

更多信息:

当您使用单位时,实际上是在分配类型。转换可以通过强制转换或基于参数类型区分函数调用(函数重载)来实现。几乎任何静态类型语言(允许您彻底定义类型)都允许您执行类似的操作。这将使您的程序更加健壮,尽管那些喜欢动态类型语言的人可能会争辩说,相对于为大多数应用程序实现这样一个完整的类型系统所花费的时间来说,收益很小。另一方面,建立一个新的系统将值得这样一种类型的系统。


语法有点不同,但我觉得您的示例与一些常见示例非常相似,比如一些人如何使用Haskell的类型系统(或任何类型的函数式语言),不过,正如我所提到的,这在类似C的语言中也是可行的。

SQL,或者至少MySQL有一些基本的基于时间的单元支持

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)
MySQL已经

查看int类在何处扩展以支持Hours()、Days()等方法的答案

Powershell具有处理文件大小等的功能


MSSQL中的接受日期算术的单位,如日、小时等。

不是语言的一部分,但我以前在C中见过这种情况,类似于:

#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;
在当时,这对我来说似乎是一件令人憎恶的事情,与
“#define begin{
“#define end}”
-如果你不喜欢这种语言的工作方式,请使用不同的语言;不要试图以这种可怕的方式屈从于你的意志


这似乎仍然是一件令人厌恶的事情,但我在晚年时已经成熟了,至少能够理解为什么有人认为这是一个好主意。

你可能对F#support感兴趣。

F#有度量单位。来自中国的一些例子


PowerShell有一些基本的支持。例如,
5GB/1MB
计算结果为5120

Sun的新语言堡垒支持单位,如果内存可用,它足够聪明,可以阻止你做一些奇怪的事情,比如从长度度量中减去时间度量

Mathematica有度量单位和一个不太难处理的语法来处理它们。

对Python来说几乎就是这样,允许这样的代码:

>>> 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

>>>

从句法上说,我不确定这会有什么好处

DateTime.Now + 60 years
结束

我处理“单位”的典型方法是定义常量,如果乘以这些常量,将这些单位转换为数据对象的基本单位。由于有人(breifly)将其标记为Ada,Ada版本将为:

Years : constant := 60.0 * 60.0 * 24.0 * 365.0;
DateTime.Now := DateTime.Now + (60.0 * Years);

我认为C++中的思想可以做得差不多,只是时间对象可能是大整数而不是Reals。< /P> < P>不是单位,本身…但有一种方法可以使用扩展方法来提供类似于单元的功能。这个例子特别适用于TimeSpan

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);
    }
}
然后,只需4.ToMinutes()即可提供4分钟的时间跨度。如果要使用类似的基类来表示其他单元类型,则可以添加相同类型的扩展功能


(注意:这只是Ruby示例的C#表示。)

我知道你的意思,对此我也很好奇。(我的高中化学老师坚持认为没有单位的数字是毫无意义的。无论如何…)

使用任何强类型语言,都可以为这些概念编写类。我已经用C++、java和Pascal编写了它们。谷歌“单位”和“Java”,你可以找到一个
DateTime.Now.AddYears (60)
Years : constant := 60.0 * 60.0 * 24.0 * 365.0;
DateTime.Now := DateTime.Now + (60.0 * Years);
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);
    }
}
now[] - 60 years