LINUX.ORG.RU
Ответ на: комментарий от next_time

совершенно верно

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

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

А ты смешной в квадрате.

Ну я тебе уже сообщил. Пыхти, потом посмеёмся.

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

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

P.S.: Тогда в Расте уже все готово:
https://doc.rust-lang.org/std/primitive.u64.html#method.checked_sub

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

P.S.: Тогда в Расте уже все готово:

Бездарность, ты откуда вылезла такая нелепая? Это обёртка над ворованными из llvm операциями, всё это работает в рантайме. И это бездарное мусорное говно в принципе неюзабельное. Поэтому в школу, а уже после прибегай что-то кому-то сообщать.

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

Молодец, я до сих пор не понимаю почему вас так тянет жрать говно. Я тебе уже сообщил, что в подобное может только С++ и всякая фп-маргинальщина. Очевидно, что раст-говне(как и на твоей жабке) ты не сможешь даже <0, 100> превратить в <0, 200>.

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

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

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

Изучи тему, я тебе даже накидаю базу.

С благодарность бы почитал.

Мусорный фанатизм

В каком месте вы увидели фанатизм?

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

Чёт проверил, Раст быстрее и проще плюсов. Он выполняет бесконечный цикл за 3 секунды.

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

С благодарность бы почитал.

Хорошо, я займусь этим.

В каком месте вы увидели фанатизм?

Необоснованная вера. Хотя в какой-то мере к этому можно привлечь и меня, но я как минимум точно знаю, что ничего из мейнстримного в это не может. Но я исправлюсь. Пусть будет «из того, что я знаю(а знаю я много) - ничто кроме С++ и фп-маргинальщины в это не может».

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

С благодарность бы почитал.

У в ближайшее время не будет возможности накидать что-то фундаментальное. Этого будет достаточно для понимания идеи: https://godbolt.org/z/5eS1-X Я там по возможности шаблоны все выпили.

Если делать фундаментально - это нужно реализовывать интервалы и заменять ими мусорный max.

Так же, на базе интервалов реализуются ифы. Допустим, если ты хочешь реализовать:

if(x > 123) - тебе нужно будет сделать что-то типа сплита, что-бы он поделил тебе x на два колбека до 123 и после 123.

Так же можно переопределить операции (x > 123_c) и возвращать какие-нибудь подинтервалы. Правда из напрямую вызвать будет нельзя, но зато можно от них вызвать калбек.

Можно сделать select(123_с), который вернёт по селектору над интервалами твой опционал - это вариация колбека(из прошлого пункта), но его можно обойти.

Так же, всегда можно реализовать рантайм-проверку. Там когда-нибудь запилят static_printf, либо какой-нибудь static_warning.

Над всем эти очень долго думать, но ты вначале попытайся запилить аналог того кода. Я не против потом и дальше подумать.

anonymous
()

Кстати, защита от переполнения переменных по-хорошему должна быть не на уровне компилятора, а на уровне кода. Можно же провести проверку перед арифметическим действием. Вот, например, пример вычисления факториала с защитой от переполнения переменной:

program factorial64;
var
        x, k: Int64;
begin
        k := 1;
        x := 1;
        while $7fffffffffffffff / k >= x do begin
                x := x * k;
                writeln(k, '! = ', x);
                inc(k);
        end;
end.
$ ./factorial64
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
9! = 362880
10! = 3628800
11! = 39916800
12! = 479001600
13! = 6227020800
14! = 87178291200
15! = 1307674368000
16! = 20922789888000
17! = 355687428096000
18! = 6402373705728000
19! = 121645100408832000
20! = 2432902008176640000
$
Как видно, 21! в переменную уже не влезет. Что¸ собственно, можно и на практике посмотреть.
program factorial64dangerous;
var
        x, k: Int64;
begin
        x := 1;
        for k :=1 to 21 do begin
                x := x * k;
                writeln(k, '! = ', x);
        end;
end.
...
19! = 121645100408832000
20! = 2432902008176640000
21! = -4249290049419214848

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