Подтвердить что ты не робот

Существуют ли какие-либо языки, которые позволяют подразделениям?

При написании следующего сегодня в С#

DateTime.Now.AddYears(-60)

Я задавался вопросом, существуют ли какие-либо языки, которые допускают более естественный синтаксис с единицами:

DateTime.Now - 60years

Кто-нибудь знает? В частности, меня интересует наличие единичных операторов (?), Которые превращают "60 лет" в, например, "TimeSpan.FromYears(60)". Также было бы аккуратно определять свои собственные операторы модулей, подобно тому, как вы можете писать операторы преобразования в С#

(Да, я знаю, что TimeSpan не обслуживает годы - это пример.)

4b9b3361

Ответ 3

Хорошо, что библиотека ActiveSupport для ruby ​​расширяет класс Integer с помощью таких методов, как часы и дни, что позволяет писать такие вещи, как:

Time.now + 5.days

Но это не очень синтаксическая функция - это просто вызов метода и возможен на любом языке, который позволяет добавлять методы к существующему классу. Вы можете сделать это в С# с помощью методов расширения - хотя там должно быть 5.days().

Ответ 4

Существует библиотека Boost С++ для Units, которая широко использует метапрограммирование шаблонов, чтобы обеспечить что-то похожее на синтаксис, который вы желаете.

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

Ответ 5

Sun новый язык Fortress поддерживает блоки и, если память служит, достаточно умен, чтобы остановить выполнение нечетных вещей, таких как вычитание мер времени из мер длины.

И Mathematica имеет единицы измерения и не слишком громоздкий синтаксис для их обработки.

Ответ 6

Unum делает в значительной степени именно это для 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

>>>

Ответ 7

Библиотека Java JODA работает именно так.

И есть JSR-275, который предлагает структуру единиц.

Я впервые услышал об этой проблеме еще в 1997 году от Мартина Фаулера. Об этом он написал в своих "Паттернах анализа".

Ответ 8

Когда вы используете единицы, вы фактически назначаете тип. Конверсии могут быть реализованы посредством кастинга или путем дифференцирования вызовов функций на основе типов параметров (перегрузка функций). Почти любой статически типизированный язык (который позволяет тщательно определять типы) позволит вам сделать что-то подобное. Это сделает вашу программу более надежной, хотя те, кто предпочитает динамически типизированные языки, могут утверждать, что выигрыши малы относительно времени, затраченного на внедрение такой тщательной системы типов для большинства приложений. С другой стороны, построение Mars Climate Orbiter заслуживает такой системы типов.

Синтаксис немного отличается, но ваш пример поражает меня так же, как и обычные примеры того, как некоторые из них будут использовать систему типа Haskell (или язык любого типизированного функционального языка), хотя, как я уже упоминал, это также возможно в C-like языки.

Ответ 9

См. ответ на Расширения С#, где класс int расширен для поддержки таких методов, как Hours(), Days() и т.д.

Powershell имеет операторы kB, MB и GB для обработки размеров файлов и т.д.

Функция DATE_ADD() в MSSQL принимает единицы измерения, такие как день, час и т.д. для арифметики даты.

Ответ 10

Не единицы, как таковые... но один из способов использования методов расширения, чтобы дать вам функциональность, подобную модулю. Этот пример относится к 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() дает вам TimeSpan 4 минуты. Если у вас есть аналогичные базовые классы для работы с другими типами устройств, можно добавить те же возможности расширения.

(Примечание: это просто представление С# для примера Ruby.)

Ответ 11

Ada, а его кузен, VHDL, напрямую поддерживает концепцию единиц. Поскольку эти языки чрезвычайно строго типизированы, единицы являются естественной способностью строгости типов.

Ответ 12

Я нахожу С++, вы можете сделать класс единицы с перегруженными операторами и некоторыми макросами #define

Ответ 13

Я не знаю, существует ли еще один, но я ожидал бы, что такие вещи появятся как DSL в следующей паре лет. Я думаю вроде следующего поколения MATLAB или что-то в этом роде. Я уверен, что для таких вещей есть масса математических, научных и инженерных применений.

Ответ 14

SQL, или atleast 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)

Ответ 15

MySQL имеет эту функцию


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'

Ответ 16

Я знаю, что вы имеете в виду, и мне тоже было интересно об этом. (Мой учитель химии в средней школе был непреклонен, что цифры без единиц были совершенно бессмысленными. Во всяком случае...)

С любым строго типизированным языком вы можете писать классы для этих понятий. Я написал их на С++, Java и Pascal. Google "Единицы" и "Java", и вы можете найти библиотеку, которая имеет все виды физических измерений, инкапсулированных таким образом.

С++, при этом преобразования типа slicker и перегрузка оператора могут сделать этот взгляд более естественным. На самом деле вы можете сделать что-то красивое, попадая в то, что я думаю, вы хотите. Java, хотя и делает это, потребует более явных преобразований и неудобного синтаксиса.

Но нет, я этого не видел.

Ищите языки, специфичные для домена, созданные для ученых, даже "образовательные".

Ответ 17

Frink - это язык, специально предназначенный для "физических вычислений". Из документации:

Frink - практичный инструмент расчета и язык программирования, предназначенный для сделать физические вычисления простыми, чтобы помогите обеспечить получение ответов правильно [..]. Он отслеживает единицы измерения (футы, метры, килограммы, ватты и т.д.) через все расчеты, позволяющие вам смешивать единицы измерения прозрачно [..]

Ваш пример в Frink:

now[] - 60 years

Ответ 18

Я не видел такого языка, который бы поддерживал его по своей сути. Однако вы можете, конечно, написать свои собственные объекты на основе даты на разных языках, если вы так склонны.

Ответ 19

Я уверен, что это не то, что вы ищете, но в области тестового и измерительного оборудования было бы необычным, если бы "тестовая программа" включала в себя заявления, которые работают с значениями, выражаемыми напряжением, током или единиц времени.

Очень специализированный материал, хотя и почти не узнаваемый большинством языков программирования.

Ответ 20

Функция PHP strtotime() делает это очень хорошо. Он берет строку и необязательное время в качестве параметров и будет анализировать строку, чтобы определить новое время.

Примеры:

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

Подробнее здесь: http://us2.php.net/strtotime

Ответ 21

Не часть языка, но я видел, что делал это раньше в 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 }" - если вам не нравится, как работает язык, используйте другой язык; не пытайтесь согнуть его по своей воле таким отвратительным образом.

Это по-прежнему кажется мерзостью, но я смягчился в старости и, по крайней мере, понимаю, почему, возможно, кто-то думал, что это хорошая идея.

Ответ 22

PowerShell имеет базовую поддержку. Например, 5GB/1MB оценивается до 5120

Ответ 23

Синтаксически, я не совсем уверен, что benifit будет

DateTime.Now + 60 years

Более

DateTime.Now.AddYears (60)

Моим типичным методом обработки "единиц" является определение констант, которые преобразуют эти единицы в базовый блок объекта данных, если они умножаются. Поскольку кто-то (вкратце) отметил это с помощью Ada, версия Ada была бы следующей:

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

Я думаю, что вы можете сделать почти то же самое в С++, за исключением того, что их объекты времени могут быть большими целыми числами, а не reals.

Ответ 24

В Perl вы можете использовать DateTime, который позволяет такие вещи, как:

my $dt = DateTime->now
$dt->subtract( hours => 1 );