Изменение семантики записи [1,2,2,3] - предложение

Красивее - да. Но как я и сказал - для этого уже есть Arr. И он ещё и лучше, потому что можно явно указать тип элементов.

Я внимательно прочитал, все посты от всех.

Дело не в этом. Если делать через диапазонный тип - запись [1,2,3] легко в конструкторе диапазона превратить в то же самое что [1..3], без особых ударов по производительности.

И тогда if x in [...], к которому все больше привыкли, будет работать не менее эффективно чем в старой реализации. С единственной поправкой - теперь диапазон надо кешировать ручками. Хотя кеширование тоже не сложно реализовать, тупо скопипастить код от set of T.


Ну и собственно насчёт реализации диапазонов - предлагаю сортированное дерево единичных диапазонов.

То есть разворачивание [1,3..5,7] в:

     o
    / \
(1..1) o
      / \
 (3..5) (7..7)

При этом если добавить в диапазон значение [2] - элементы [1] и [3..5] склеятся и получится [1..5].

Сейчас [1,3…5,7] тупо разворачивается во все элементы в виде хешсета

Тип b теперь будет array of integer. Разницы в скорости не будет. Или это будет заменено на вызов Arr

1 лайк

Сейчас оно разворачивается в set of integer, который уже содержит все элементы в виде HashSet + свои данные, вроде верхней и нижней границ.

Нет, Arr вызывать точно не надо. new T[]( ... ) хотя бы быстрее раза в 2, потому что не создаёт лишнюю копию массива.

Зачем, кстати, вообще она создаётся?

Наверное, чтоб когда передали в Arr не params элементы а именно массив - в ответе возвращало не ссылку на него же. Хотя всё это таки бред.

Насколько я понимаю, эти операции перестают работать только для констант, так? То есть вот такое сохраняет старую семантику:

   var s: set of integer := [1,2,2,3];
   s := s + [1,2,5,6];

Если так, то особых проблем не усматриваю.

1 лайк

Первая из Ваших строк, насколько я понял, точно будет работать. Вторая - не уверен, поскольку операнд [1,2,5,6] теперь будет считаться массивом. В первой строке [1,2,2,6] - не операнд, а инициализатор, а тут получается что должно идти неявное приведение массива к множеству. А почему, собственно, с точки зрения измененной семантики языка? Ну, либо это надо учесть при перегрузке всех подобных операторов. Посмотрим, что скажет автор идеи.

Кстати, тут есть еще вопрос, который как-то ускользнул.Вот пример из Справки:

var 
  bs: ByteSet := [1,3,5,20..25];
  fios: StringSet := ['Иванов','Петров','Сидорова'];

Там он приводится как описание множества с инициализацией и автовыведением типа. А теперь получается, что это будут массивы?

Далее, как быть с этим? :

Множество, задаваемое конструктором множества, может иметь элементы
различных типов, например:
[1..4,5.5,'c','xyz',Winter..Autumn]
В этом случае вычисляется наиболее общий тип, и он объявляется
базовым типом множества. Например:
[1..4,5.5] // set of real
['1','abc'] // set of string
[1,'1'] // set of object
Для множеств имеет место структурная эквивалентность типов. 

И при всем этом

var bs1: set of byte := [1,3,5,20..25];  // set of byte
var bs2 := [1,3,5,20..25];  // array of integer

Такой занятный когнитивный диссонансик. Для внесения пущей сумятицы в неокрепшие умы.

И он схватил мумию в охапку и понёс в прихожую.
– Как приятно будет Филле и Рулле встретиться с Мамочкой!
                                        ("Карлсон, который живет на крыше")
1 лайк

Можно предусмотреть сложение множества с массивом - и результатом будет множество. То есть, будет работать как раньше.

Если bs - это set of byte, то по идее всё должно приводиться к set of byte. Конструкция, используемая в инициализаторе - ещё не массив.

В произвольном контексте это будет массив objectов, что ничему не противоречит

Во втором случае это будет специальный тип поскольку он содержит диапазоны. Он будет более эффективно храниться и неявно преобразовываться к set of integer и array of integer.

Прошу еще раз понять, что

var bs := [1,3,5,20];  // array of integer
var bs := [1,3,5,20..25];  // некий третий тип - не массив и не множество
1 лайк

Вообще-то я имел в виду дух, а не букву. Но готов немного изменить вопрос.

var bs1: set of byte := [1,3,5,20,25];  // set of byte
var bs2 := [1,3,5,20,25];  // array of integer

Дух уже и так такой есть:

var a: array of integer := (1,2,3);
var t := (1,2,3);

И никто не умер

Да тут все ясно, тут по любому массив получается. А там - не описал тип - массив, описал - может и множество. Выходит какое-то понятие: “тип по умолчанию”. Ну вот у числовых констант тип по умолчанию integer, но если литерал в правой части изображает число, переменную не получится описать строковой.

Во втором случае кортеж.

Я тут тоже подумал… Дело хорошее, и плюсы явно видны. Тут уже об этом говорили. Из минусов только отход – нет, не от Делфи )) – а от “школьного” Паскаля. На ЕГЭ ведь так и будут на старославянском, ой, на старопаскальском ) писать. Будем, как обычно, учить два языка…

Но это ничуть не причина отказываться от таких новшеств. Как бы (наверное) процитировал в этом месте Александр Викторович, “Если ты ещё раз вмешаешься в опыты академика, и станешь на пути технического прогресса, я тебя…”

Если нетрудно - Вадим - приведите пример кода. где отход от старого Паскаля будет с вашей точки зрения чувствоваться?

Да, это я в полемический раж вошел. Неправ. Посыпать, что ли, пеплом голову и в пустыню удалиться, оглашая ее горестными стенаниями и воплями?

Я изначально писал, что двумя руками за нововведение. Попытка раскачать лодку, изобразив на время оппонента, потерпела крах. @Admin, не пора ли подумать о реализации задуманного? )))

2 лайка

Я такой пример привести не смогу, потому что отличия в коде и вправду минимальны. Я немножко про другое говорил: про довольно большую массу учителей, которые каждое нововведение будут принимать в штыки. То есть тут они мне скажут: ну вот, теперь ещё и квадратные скобочки – не множества… То есть ещё одна причина учить по-старому.

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

5 сообщений перенесены в тему Болталка PascalABC.NET

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

Matr((1,2,3),(2,3,4))

Инициализация обычных массивов и так нормальная: Arr(1,2,3)

1 лайк

Наверное, всё же такое:

Matr([1,2,3],[2,3,4])

Я согласен.

1 лайк