PascalABC.NET версия 3.6.2 (будущие изменения)

https://pascalabcnet.github.io/mydoc_release_notes_3_6_1.html

За перегрузки Pred и Succ особое спасибо. Насчёт вопроса - мне кажется должно происходить обычное переполнение. То есть Succ(char(word.MaxValue),1) должно возвращать #0.

А насчёт JoinIntoString - много кода, конечно, сломается. Но всё же чистить такие мелочи в целом хорошая практика.

Не совсем понятно зачем они нужны, если проще написать + или - для некоторого значения. Ради чего они планируются? Ради совместимости с другими Pascal? Даже если и ради неё, то, как по мне, это странно, ибо язык много где отказался от неё, точнее некоторая каша - здесь за данную совместимость держаться, а тут нет. Но, если нет, то какая выгода от этих функций? И почему только для символов?

Лучше тогда уже сохранить обе версии, на время. Потом - старую удалить. Либо сразу перенести в специальный модуль для обратной совместимости, например PABCSystemBC (back compatibility). Нужна обратная совместимость - пусть подключат дополнительный модуль. Это не только к переименованию относится, а вообще к изменениям, нарушающим обратную совместимость. Так делаю, например, в NETSquirrel.

Для символов надо очень объёмный код для такого.

JoinIntoString останется, но нигде не будет виден

1 лайк

‘z’+1 это поведение уже определено - это ‘z1’

1 лайк

Хорошая идея. Думаю, поступим по-другому: 2 годика пусть побудет невидимым. Потом сделаем ключевое слово deprecated - и будет выдаваться предупреждение. А потом и уберём.

2 лайка

Есть атрибут ObsoleteAttribute для этой цели уже. Сами же говорили не раз, лишние ключевые слова - ни к чему. Кстати, в Free Pascal такое ключевое слово есть.

1 лайк

Да и поддерживать этот атрибут компилятором - лишним явно не будет. У многих .dll написанных на C# можно его встретить, но сейчас паскаль просто молчит о нём.

Если бы язык строго держался не только за .NET-языки, но и иные Pascal, то ключевое слово deprecated было бы не лишним. Но, сейчас это не так. Сейчас у нас совместимости почти нет… Если @Admin решит взять курс на хорошую совместимость с другими диалектам Pascal, то флаг ему в руки, пусть делает. Но, сейчас если пытаться там делать что-то для совместимости, тут - нет, получится ещё лишь большая каша с этим… Не хотелось бы усугублять ситуацию.

ObsoleteAttribute - при использовании метода возвращается ошибка. Это не то, что мы хотим

Можно, всё-же, увидеть код? У меня всё в порядке:

uses System;

[Obsolete]
procedure P() := exit;

begin
end.

Скажем, так:

///--
function JoinIntoString(...): string; extensionmethod; deprecated;
begin
  ...
end;

Она не видна, но если кто-то использует, бросается Warning.

Вот, в Java:

@Deprecated — когда мы хотим сообщить компилятору то, что метод является устаревшим, мы должны использовать эту аннотацию. Документация по Java рекомендует предоставлять компилятору информацию о том, почему этот метод является устаревшим и какой метод следует использовать вместо него в Javadoc.

Это хорошее решение, но:

  • Подобное ключевое слово используется в Free Pascal, вроде бы, всё хорошо. Но, почему тогда в других местах совместимости с ним почти нет? Вполне логичный вопрос.
  • Язык на платформе .NET и хорошо было бы, если бы он был совместим с другими языками. В данном случае - этого не будет (хотя, может, это ключевое слово - синтаксический сахар над Obsolete и тогда - этот пункт не в счёт). В общем, зависит от реализации.
1 лайк

А, да, увидел, спасибо. Там в Obsolete параметр есть, бросать исключение или warning

Всё-же, что на счёт первого пункта? У нас границы совместимости с другими диалектами Паскаля какие-то размытые. Может, стоить чётко решить, держаться ли за совместимость или нет? Точнее, чтобы не только Hello world-ы с других диалектов на PascalABC.NET компилировались. Предлагаю посмотреть на Free Pascal, там многие вещи включаются директивами.

Не понял. В каком первом пункте. И в чем вопрос.

Вопрос про новое ключевое слово:

Да, я согласился, что Obsolete правильнее

Добавлено s.IndicesOf

… но временно. Как и анонсировано, войдет в версию 3.6.2.