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

Кто хотел узнать как в описании сделать выделения.Я конечно узнал только это, но это тоже хлеб :

2 лайка

пробовал другие XML теги, но чего то не работают

Как насчёт добавить снипет для регионов?

{$region |}

{$endregion}

Когда пишешь просто $region в файле, где их уже полно, до того как успеваешь добавить $endregion - анализатор кода уже сошёл с ума, из за того что кол-во начал и концов регионов не одинаковое. Он там разворачивает рандомные регионы, некоторые может и свернуть так же рандомно. Ну и конечно начинаются те графические баги о которых я давно писал. Если вставлять регион по Ctrl+V - этого всего нет. Поэтому снипет тут очень помог бы.

А давайте определимся, что вы называете сниппетом?

Это не я называют, это во всех IDE так:

Набираете несколько букв, как be, нажимаешь Shift+Space - и получаете сразу большой кусок текста (в случае be это begin-end.).

У вас снипеты находятся в файле C:\Program Files (x86)\PascalABC.NET\template.pct

Да, внёс

1 лайк

У меня появилась идея: Сделать панель “Список задач”, в которой будет подсчитано количество всех токенов (Todo, FixMe, Hack, Undone) в коде; выведена каждая задача для своего токена, указана его строка.
Например, в Microsoft Visual Studio 2017 сделано так:
image

Думаю, было бы удобно разместить такую панель здесь
image
Можно бы было сразу в одном месте посмотреть все планы на будущее на улучшение и исправление кода. А также посчитать, сколько задач всего осталось. Главное преимущество: Компактность и удобство, пользователь бы сам мог открыть список задач. Это будет особо эффективно в большом коде, где искать, что нужно сделать и исправить, более сложно.
Также можно было бы отсортировать токены и создать дерево
(можно сворачивать и разворачивать):
ToDo (3) +
FixMe (1) +

ToDo (3) –
ToDo: Сделать задачу 1 (строка 5)
ToDo: Сделать задачу 2 (строка 7)
ToDo: Сделать задачу 3 (строка 8)

FixMe (1) –
FixMe: Исправить ошибку 1 (строка 11)

1 лайк

А можно ещё лучше:

   Приоритет ( Высокий )
    FixMe (1) –
    FixMe: Исправить ошибку 1   (строка 11)  

    Приоритет (Низкий)
    ToDo (3) –  
    ToDo: Сделать задачу 1	       (строка 5)  
    ToDo: Сделать задачу 2         (строка 7)
    ToDo: Сделать задачу 3         (строка 8)

В папке C:\PABCWork.NET\Samples\!MainFeatures\01_First есть пример Amp.pas:

// Пример иллюстрирует использование значка & для снятия атрибута ключевого слова
var 
  &begin,&end: integer;
begin
  &begin := 1;
  &end := 2;
  var t: System.Type := &begin.GetType; // в System.Type использовать & не надо
  write(&begin,' ',&end,' ',t);
end.

Как насчёт добавить туда пример Amp2.pas:

// Пример иллюстрирует использование значка & для явного указания шаблонного типа подпрограммы

function GetDefault<T>: T :=
default(T);

begin
  
//  var o := GetDefault<byte>; //Ошибка: Встречено ';', а ожидалось выражение
  // компилятор не отличает знак сравнения < от открытия скобочки
  // и поэтому видит эту строчку как "(GetDefault < byte) > ;"
  // ";" там оказывается неожиданно, потому что компилятор ожидал ещё какое то выражение для сравнения
  
  // но, знаком "&" можно экранировать "<"
  // то есть переключить значение "<" со знака сравнения на открывающуюся скобочку:
  var o := GetDefault&<byte>;
  // это нужно только для подпрограмм и только когда вы указываете шаблонный тип явно
  
end.

Как тут правильно заметили - нигде нормально не объясняется тот факт, что < в вызове подпрограмм надо экранировать. Да и не первый и не десятый раз я на этом форуме объясняю почему это так работает, вы наверняка видели. Поэтому такой пример будет очень даже кстати.

Да ну? Прямо-таки и нигде? Вот Справка, “Обобщенные типы” - “Обобщенные подпрограммы: обзор”:

%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA

А теперь, к примеру, и в публикуемой книге есть глава 7.6 “Обобщенный тип” - там это тоже все написано.

Другое дело, что многим напрягаться лень - вот Вы и пишете " не первый и не десятый раз".

Сделайте pull request - добавим

При всё уважении, Александр, хотя с сидячей работой я за последние полгода набрал десяток кило лени, в данном случае это скорее невнимательность и недостаток опыта:

var словарь:=new  dictionary<string,string>; 
//всё нормально

var info:= searcher.Get().Cast<ManagementObject>().FirstOrDefault(); 
//ошибка - нужно обязательно добавить амперсанд & после Cast

Конечно, теперь я знаю такой момент и если пример не будет работать, буду искать что заэкранировать, но это не столь тривиальная задача для новичка.

1 лайк

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

///-function Sign(x: число): число;
/// Возвращает знак числа x
function Sign(x: shortint): integer;
///--
function Sign(x: smallint): integer;
///--
function Sign(x: integer): integer;
///--
function Sign(x: int64): integer;
///--
function Sign(x: byte): integer;
///--
function Sign(x: word): integer;
///--
function Sign(x: longword): integer;
///--
function Sign(x: uint64): integer;
///--
function Sign(x: real): integer;
///--
function Sign(x: BigInteger): integer;

Sign возвращает не тот же тип что принимает, а (x: число): число только запутывает.

Предлагаю сменить описание на следующее:

///-function Sign(x: число): integer;
/// Возвращает -1, 0 или +1, в зависимости от знака числа x

Может имеет смысл объединить подтипы в функцию на подобии:

Function SGN(X:real):Shortint:=(X>0)?(1):((X<0)?(-1):(0));

Не разобрался как написать универсальную процедуру без оверрйдов для вывода любого типа:

Procedure Вывод(X);->PrintLn(X, X.GetTypeCode, '[',SGN(X),']');

Также, при возможности и опционально, мне хотелось бы увидеть подсвет впервые объявленных переменных.

Конечно, решать разработчикам, но поскольку функция возвращает константу -1, 0 или 1, ее тип по умолчанию - integer. По крайней мере для всех типов аргументов, приводящихся к integer без потерь.

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

Это имеет смысл только на 8-битном компьютере, который вы сейчас разве что в музее найдёте. На 32-битных и выше - лучше всего работает integer.

Это можно только в C++, в .Net языках типизация более строгая. Максимум что можно сделать в .Net - это подшаманить с интерфейсами вроде IComparable (хотя вряд ли сработает). Но это так же будет бить по производительности, потому что все типы которые принимает Sign - записи, то есть размерные типы, а интерфейсы это ссылочные типы. Для вызова нужен будет боксинг и вызов виртуальных методов, что так же ужасно медленно.

При чём тут тип аргумента? Sign должно возвращать integer, в том числе и для аргумента типа real - потому что тогда его можно использовать как аргумент в case. Эта возможность активно используется, по крайней мере на куберфоруме (и до меня ещё).

И вот в том то и дело,

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

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

А насколько примеными шаблоны?

Function SGN<T>(X:T):T:=(X>0)?(1):((X<0)?(-1):(0));

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

Описание, конечно, надо бы подправить.

Поправим. Там integer везде конечно