Замечания и предложения

Исправили

Это что? Дельфизм какой то?

begin
  var i1: integer := 5;
  var i2: integer = 5; // так тоже работает
end.

Это по программе перехода к C# :smile:

1 лайк

По-хорошему, если бы синтаксис разрешал объявлять в произвольном месте кода константы, я бы не стал возражать :smile:

А то сейчас компилятор ругается в стиле “Встречено ‘const’, а ожидался оператор”. У нас получается, что есть рекомендация объявлять переменные в месте, максимально близком к месту их первого использования, а на константы это почему-то не распространяется, хотя константа - суть инициализированная переменная, доступная только на чтение.

3 лайка

Не ожидал конечно от вас хотелку услышать)) Но да, о внутриблочных константах и я давно мечтаю и пару раз говорил…

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

И да, я не имел в виду внутриблочных констант, все куда незатейливее. Я лишь хотел сказать, что неплохо распространить право упоминать константу не только в разделе констант (как и переменные - в разделе описания переменных), но и в любом месте по тексту программы.

Это:

begin
  const x = 5;
end.

И называются внутриблочные, ибо они внутри блока begin-end. А других вариантов где

может находится - нету. Они или в блоке или вне, то есть там же где новомодный и старомодный var-ы соответственно.

Спасибо, я знаю, что такое внутриблочные объекты. И еще раз, третий, пишу о том, что на внутриблочные не претендую, а было бы хорошо иметь возможность описать константу не в разделе const, а в текстуально удобном месте. Примерно вот так:

const
  rho1 = 7.874; // Fe
  rho2 = 11.3415;// Pb

function P(rho, V, g: real) := rho * V * g;

begin
  var V := ReadReal;
  const g = 9.81; // Earth
  Println(P(rho1, V, g), P(rho2, V, g));
end.

А можно тогда пример с константами, которые сейчас не разрешает описать, но так чтоб они небыли внутриблочными?

Потому что я вам не понимаю, вы говорите что не претендуете на внутриблочные константы, и сразу даёте пример где именно такой и не хватает.

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

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

Это общепризнанная терминология, ну да ладно)

Не всегда. В Паскале программа - это блок, перед которым располагаются секции описаний. У прочих, внутренних блоков, нет предваряющих их секций.

Да. В Delphi есть типизированные константы, которые на самом деле переменные. Для этого и сделано. Вам это мешает?

begin
  var a: integer := 5; // корректно
  var b: integer = 5; // корректно и порождает вопросы
  a += 1; // корректно
  b += 1; // корректно
  var c: integer;
  c := 5; // корректно
  var d: integer;
  d = 5; // ОШИБКА
  var e := 5; // корректно
  var g = 5;  // ОШИБКА
end.

Наличие конструкции var b: integer = 5; порождает больше вопросов, чем приносит пользы. Возможно, стоит где-то в Справке явно сказать, что она оставлена исключительно для совместимости с Delphi и не рекомендуется к применению в создаваемых программах.

В справке так и сказано, кстати)

В справке “сказано” так:

или

имя: тип = выражение; // для совместимости с Delphi

Т.е рекомендаций не использовать в новых программах нет. Кроме того, формат не предусматривает наличия ключевого слова var для описания в произвольном месте программы: сказано, что перечислены форматы раздела описаний.

Если на экране есть регион содержащий много кода - IDE начинает задыхаться:

Программа, которой я сделал этот большой файл:

begin
  System.IO.File.Delete('2.pas');
  var sw := System.IO.File.CreateText('2.pas');
  
  sw.WriteLine($'program prog;'); // иначе точка сворачивания документа и первого класса - совпадут
  for var rn := 1 to 10 do
  begin
    sw.WriteLine;
    sw.WriteLine($'{{$region r{rn}}}');
    
    for var cn := 1 to 500 do
    begin
      sw.WriteLine;
      sw.WriteLine($'type t_{rn}_{cn} = class end;'); // не важно чем заполнены регионы, это первое что я придумал
    end;
    
    sw.WriteLine;
    sw.WriteLine($'{{$endregion r{rn}}}');
  end;
  
  loop 20 do sw.WriteLine; // чтоб было куда прокручивать
  sw.Write($'begin end.');
  sw.Close;
end.

Как видно в конце видео - эта проблема очень мешает делать OpenGL.pas. Я перевёл только основные функции и типы, и файл уже получился на 7к строк. Больших регионов там всего 2, на 3к и 4к строк (типы и функции соответственно), а остальное пока так, по мелочи. Вот когда эти регионы на экране - IDE ужасно лагает.

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

Вообще, Intellisense — крайне неоптимизированная и ломкая вещь. Потому что никто изначально не собирался использовать PascalABC.NET для крупных проектов. Рано или поздно его нужно будет рефакторить. Твою проблему решат точно не скоро.

Анализатор кода тут не при чём. Лагает само рисование текста в IDE.

[quote=“developer46, post:1306, topic:143, full:true”]

unit __RedirectIOMode;

//------------------------------------------------------------------------------
// Модуль подключаемый в режиме запуска со связью с оболочкой                  
// (с) DarkStar 2007
// Функции:
//    1. Посылка в поток ErrorStream сигнала [READLNSIGNAL]
//    2. Перехват исключений по AppDomain.CurrentDomain.UnhandledException и 
//       пердача их в поток ErrorStream // может быть "передача"?
//    3. Перехват исключений по Application.ThreadException и 
//       пердача их в поток ErrorStream // "передача" ?
//------------------------------------------------------------------------------

Это опечатка? Нужно ли исправлять?

Спасибо за исправление опечатки!
P.S. Последняя опечатка:

// Copyright (©) Сергей латченко ( github.com/SunSerega | forum.mmcs.sfedu.ru/u/sun_serega ) 
//                      Латченко (может, с большой буквы?)
// Этот код распространяется под Unlicense  
// Для деталей смотрите в файл LICENSE.md или сюда:   
// https://github.com/SunSerega/PascalABC.Net-BlockFileOfT/blob/master/LICENSE.md          
(************************************************************************************)
unit BlockFileOfT;

Спасибо за чтение сообщения, извиняюсь за излишний перфекционизм.