LINUX.ORG.RU

Современный ЯП с системой типов как в Ada

 , , ,


0

3

Вот какая крутотень:

type Day_type   is range    1 ..   31;
type Month_type is range    1 ..   12;
type Year_type  is range 1800 .. 2100;
type Hours is mod 24;
type Weekday is (Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday);

type Date is
   record
     Day   : Day_type;
     Month : Month_type;
     Year  : Year_type;
   end record;
В каких ЯП ещё так можно (задавать/проверять диапазон значений не в runtime, а при компиляции)?

Дельфи. А что толку о такой проверки, Day_type[32] или как у тебя там, ругается, а Day_type[i+32] нет.

ilovewindows ★★★★★
()

В каких ЯП ещё так можно (задавать/проверять диапазон значений не в runtime, а при компиляции)?

В Ada диапазон проверяется в рантайме.

tailgunner ★★★★★
()

range 1 .. 31;

проверять диапазон значений не в runtime, а при компиляции

как именно компилятор проверит что в stdin пришло 32?

Rastafarra ★★★★
()
Ответ на: комментарий от tailgunner
procedure m is
  type t is range 0..1;
  a : t;
begin
  a := 2;
end m;
>gnatmake m.adb 
gcc-4.6 -c m.adb
m.adb:8:08: warning: value not in range of type "t" defined at line 3
m.adb:8:08: warning: "Constraint_Error" will be raised at run time
gnatbind -x m.ali
gnatlink m.ali
anonymous
()

В каких ЯП ещё так можно (задавать/проверять диапазон значений не в runtime, а при компиляции)?

В Java.

iZEN ★★★★★
()
Ответ на: комментарий от Rastafarra

как именно компилятор проверит что в stdin пришло 32?

Фи, stdin для плебеев.

anonymous
()
Ответ на: комментарий от ilovewindows

кто из нас тупит?

procedure m is

  type t is range 0..1;

  a : t;

begin
  a := 1;
  a := a + 1;
end m;
> gnatmake m.adb 
gcc-4.6 -c m.adb
m.adb:9:10: warning: value not in range of type "t" defined at line 3
m.adb:9:10: warning: "Constraint_Error" will be raised at run time
gnatbind -x m.ali
gnatlink m.ali

anonymous
()

В ATS2 именно при компиляции. Но тебе придется предоставлять доказательства. Т.е. если число, скажем, пришло из stdin, а ты хочешь положить его в переменную типа «положительный инт не больше 12», то в случае отсутствия соответствующей проверки программа не скомпилируется.

anonymous
()
Ответ на: комментарий от anonymous

Что именно ты пытался доказать этим фрагментом?

тем, что ты очередной раз пернул в лужу

Тогда у тебя снова не получилось: «For a signed integer type, the exception Constraint_Error is raised by the execution of an operation that cannot deliver the correct result because it is outside the base range of the type». Надеюсь, не нужно объяснять, что исключение возбуждается в рантайме.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

что исключение возбуждается в рантайме.

надеюсь не нужно объяснять, что компилер в компайлтайме проверил? или ты настолько туп, что ясные и понятные сообщения компилера для тебя египетские иероглифы?

anonymous
()

А чем Ada не современный ЯП? Он не намного старше новоделов, а если брать реализацию gnat и последний стандарт то можно сказать ровесник. Ладно бы про С говорил, но Ada вполне современный язык и по фичам и по реализации.

Другое дело, что наверное хотел сказать С подобный? Ну жабка, лучше ничего из кросплатформенного нету.

ixrws ★★★
()
Ответ на: комментарий от anonymous

надеюсь не нужно объяснять, что компилер в компайлтайме проверил?

Надеюсь, не надо объяснять, что проверка в компайл-тайме в общем случае не исключает необходимости проверки в рантайме?

или ты настолько туп, что ясные и понятные сообщения компилера для тебя египетские иероглифы?

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

tailgunner ★★★★★
()
Ответ на: комментарий от ixrws

Ну жабка, лучше ничего из кросплатформенного нету.

В Java уже можно сделать тип-диапазон с проверкой попадания значений в этот диапазон в компайл-тайм?

eao197 ★★★★★
()
Ответ на: комментарий от anonymous

Вообще моя идея, что значение может быть вычислено, считано из файла, явно преобразовано из целого и еще черт знает откуда, где про твой тип не знают. Вот тогда ты со своим супер языком и обломаешься. А компилять сам ты не хочешь, преобразовывай в явном виде целое, считай ты его из файла получил. Ничего интересного кроме предупреждения, что в рантайме жопа может приключиться компилятор и не напишет, но ты это все равно проигноришь и будешь лепить проверку в явном виде или исключение ловить. Ну или скажешь «нинужно».

ilovewindows ★★★★★
()
Последнее исправление: ilovewindows (всего исправлений: 1)

Смотри refinement types, dependent types

e1nste1n ★★★★★
()
Ответ на: комментарий от Rastafarra

А зачем вообще переносят какие-то проверки в compile-time?

Ну и да, хотелось бы посмотреть, как эти АТД будут выглядеть в Java. С проверками в compile-time.

eao197 ★★★★★
()
Ответ на: комментарий от eao197

А зачем вообще переносят какие-то проверки в compile-time?

ну типы --- это полезно.

а проверка на диапазон --- хз.

Rastafarra ★★★★
()
Ответ на: комментарий от ilovewindows

Ничего интересного кроме предупреждения, что в рантайме жопа может приключиться компилятор и не напишет

Пусть даже все проверки в рантайме будут, но всяко лучше один раз описать ограничения для типа, чем проверять каждое значение. Это просто усиление типизации, что есть благо. Хотя я с удивлением узнал на вашем лоре, что есть оказывается фанаты слабой типизации, так что кому как.

bread
()

ATS

val xs = $list{int}(0, 1, 2)
val x0 = xs[0]
val h = 2;
val x3 = xs[h+10] 
не даст такое сделать.

vtVitus ★★★★★
()
Ответ на: комментарий от bread

Проверка компилятором конечно лучше чем ничего, но значений в явном виде в программе раз два и обчелся , все равно у тебя в исходнике присутствует что-то типа константы dwMonday , что уже в диапазоне, а не 1. А вот значением со стороны ввода с интерфейса или из сети будет число и ты обязан будешь обмануть компилятор приведением типа. Можно еще оператор = переопределить, чтобы совсем всех запутать, но задача по проверке остается, как бы ты её не зарывал и не маскировал фичами языка. Ну закроешь ты своей усиленной типизацией какой-то класс ошибок, не самых сложных, породишь кучу новых.

ilovewindows ★★★★★
()

Любой маргинальный язык с dependent types.

Deleted
()

В каких ЯП ещё так можно (задавать/проверять диапазон значений не в runtime, а при компиляции)?

Т.е. значения ты будешь знать заранее?
Тогда везде, где есть препроцессор.

reprimand ★★★★★
()

Современный ЯП с системой типов как в Ada

Современный

Ada 2012 жы есть. Для нее 5 лет ваще не срок :)

slackwarrior ★★★★★
()
Ответ на: комментарий от tailgunner

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

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

anonymous
()
Ответ на: комментарий от anonymous

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

Ну у него случай общий

Нет.

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

В общем случае, компилятор и не может на это ругаться - он просто не знает, выйдет число за range или нет. Поэтому проверка делается в рантайме.

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от ilovewindows

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

И компилятор выдаст ошибку если ты не проверишь это число на вхождение в диапазон.

anonymous
()
Ответ на: комментарий от tailgunner

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

Ты не в курсе, что тайпчекеры работают пессимистично? Из дача не отделять корректный код от некорректного, а отвергать код, для которого корректность доказать не получается. В данном случае, если компилятор не знает тчо число не выйдет за ренж, то будет ошибка, пока ты не вставишь явное условие на проверку ренжа.

anonymous
()
Ответ на: комментарий от eao197

В Java уже можно сделать тип-диапазон с проверкой попадания значений в этот диапазон в компайл-тайм?

Можно в любом языке, который позволяет эмулировать АТД с exhaustive паттерн-матчингом. Конкретно в джаве можно на чекед эксцепшенах.

anonymous
()
Ответ на: комментарий от anonymous

Ты не в курсе, что тайпчекеры работают пессимистично? Из дача не отделять корректный код от некорректного, а отвергать код, для которого корректность доказать не получается.

Допустим. И что? С точки зрения Ады код корректен. То, что во время исполнения он может возбудить Constraint_Error, соответствует RM.

$ cat m.adb

procedure m(i:integer) is
  type t is range 0..10;
  v: t;
begin
  v := t(i) + 1;
end m;
$ gnatmake m.adb && echo OK
OK
$ 
tailgunner ★★★★★
()
Ответ на: комментарий от ixrws

Другое дело, что наверное хотел сказать С подобный? Ну жабка, лучше ничего из кросплатформенного нету.

Java на разу не C-подобная, она Pascal-подобная.

LongLiveUbuntu ★★★★★
()

Когда речь заходит об Ada, то сразу вспоминается VHDL.

gag ★★★★★
()

В каких ЯП ещё так можно

Паскаль же, причём сто лет как.

hobbit ★★★★★
()
Ответ на: комментарий от ixrws

FPC тоже вполне себе кроссплатформенный.

hobbit ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.