Ух ты, табличка какая классная! Где Вы её взяли?
Это шутка юмора была? Ваша же Справка…
Еще ошибки вывода типов (при участии Decimal):
begin
// 1) Ошибка интеллисенса:
// Если один из операндов арифметической операции типа Decimal,
// а второй -- типа ShortInt, Byte, SmallInt, Word или Integer,
// то результирующий тип отображается как Integer, а не Decimal.
var r1 := decimal(1) + shortint(2);
// 2) Ошибка интеллисенса:
// Если операнды Decimal и Int64, то результат по интеллисенсу всегда Int64, а не Decimal.
var r2 := decimal(1) + int64(2);
// 3) Ошибка компилятора:
// Если один из операндов арифметической операции типа Decimal,
// а второй -- типа LongWord или UInt64, то возникает ложная ошибка
// "Возможны два преобразования типов" при компиляции.
var r3 := decimal(1) + uint64(2);
// При этом также есть ошибка типа c интеллисенсом, но только для случая с Longword:
// отображается тип Int64 вместо Decimal.
var r4 := decimal(1) + longword(2);
end.
@Admin Фиксировать это в Issues?
Вы слишком увлеклись: в PascalABC.NET типа decimal нет. См. Справку. Это тип .NET, с которым Вы работаете на свой страх и риск.
@Admin Хотел написать предыдущий пример более корректно, как
var a := decimal(0.1) + decimal(0.2);
но вылетает странная ошибка “Возможны два преобразования типа: к типу System.Decimal и к типу System.Decimal”
Да, там с преобразованиями к decimal у нас что-то не в порядке
По моему, эти ссылки всё же надо давать, потому что даже если вы сами увидели - могут быть те что не увидят. Более того, если кто то будет читать это потом - будет сложно связать 2 события, надо будет проверять по времени.
В целом, большинство операций работает корректно.
begin
var a: decimal;
Decimal.TryParse('12345678901234567890.123456789', a);
Println(a); // все цифры из литерала точны
// a.Println; //вызовет ошибку " Неизвестное имя 'Println' "
a.ToString.Println; // работает
Writeln(real(a)); // вывод 1.23456789012346E+19
Writeln(single(a)); // вывод 1.234568E+19
//a += a; // ошибка " Операция '+=' не применима к типу System.Decimal "
a := a - 0.000000001;
Println(a); // нормально чувствует 29-й знак в числе
a := 1e-10 * a;
Println(a); // абсолютно верный результат
end.
По поводу issure - там где-то “косяк”, потому что a := c работает нормально.
Здесь всё верно. += не работает - да, мы его не определяли
Ну, может, и хорошо А то потом мерзкие статьи на хабре появляются
Жалко, что не определяли a.Println;
Наверно, мысль написать книгу была правильной. Я сейчас пока по целочисленным иду, разыскиваю на примерах различные подвохи, которые могут происходить по незнанию или неаккуратности. Вот как до вещественных дойду, посмотрим что с ними
Для всего нельзя. Это надо для каждого типа индивидуально.
А я и не прошу. Просто отметил, что жалко… Как бы нет единообразия. Вот тут .Print работает, а тут - нет. Кстати, для decimal не определена даже Sqr, не говоря о более серьезных функциях. Видимо, доллары в квадрат не возводят…
Да, это немного чужеродный тип
@admin, в #998 я использовал тайпклассы только потому что файл которым я тестировал уже был с ними, так меньше менять. С интерфейсами тоже не так:
type
I1 = interface end;
t1=class(I1) end;
procedure p1<T>(o:T);
where T: I1;
begin
writeln('I1');
end;
procedure p1<T>(o:T);
begin
writeln('not I1');
end;
begin end.
Тут пишет что p1
повторно объявлена. Это ошибка? Если нет, то как сделать чтоб на уровне компилятора решало какую подпрограмму вызвать?
Умножение процедуры на число
procedure p := Write(1); procedure q := Write(2); procedure ln := Writeln; procedure Run(p: procedure) := p; begin a1 := p*10 + ln; **//Пропущено var** a1; a1 := p*10 + q*10 + ln; a1; Run((p + q)*10 + ln); end.
Дальше:
Лямбда-выражения
Эквивалентный код без лямбд
function Cond(x: integer): boolean; begin Result := x mod 2 = 0; end; function Fun(x: integer): boolean; **//integer а не boolean** begin Result := x*x+1; **//а откуда +1?** end; begin var a := Arr(1,2,3,4,5,6,7,8,9); a.Where(Cond) .Select(Fun).Println; end.
Ещё
Типы процедурных переменных
real->real
– тип функции с параметром типаreal
, возвращающейreal
(real,real)->real
– тип функции с двумя параметрами типаreal
, возвращающейreal
()->integer
– тип функции без параметров, возвращающейreal
//А по моему integer
(real,real)->()
– тип процедуры с двумя параметрами типаreal
Это, скорее всего, не всё. Как насчёт просмотреть всё же презентации, перед тем как постить?)) (ну и теперь, те что запостили, это всё сразу в глаза бросается)
Ничего не понял. Слайд про умножение процедуры на число не про лямбды
Как это, вы дальше пролистайте. Сами же давали тут ссылку на неё, когда спросили про лямбды.
А пост мой, если что, про опечатки которые я там нашёл.