Версия PascalABC.NET 3.4

Хотелось бы уточнить. Любая функция из .dll будет считаться константной? Или только из стандартной .dll?

Да, из любой dll. Надо потестировать ещё.

Идея в том чтобы нельзя было воспроизвести ошибку с константами. А с пользовательскими функциями это можно.

Константы же в могут инициализироваться вызовами стандартных методов из dll, которые возвращают неконстантное значение. Потом их изменить нельзя.

Понять, является ли функция константной, к сожалению невозможно. Нет модификатора const для методов как в C++. Поэтому - пропишем просто эти правила в описании языка: константы расширены насколько возможно но чтобы не было багов.

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

У них есть 2 применения:

  • Указать что пунктов нельзя изменять после инициализации. Это сделано чтоб если сам забудешь, или программист, подключивший твою библиотеку не знает - нельзя было что то сломать.
  • Чтоб можно было поменять переменную в нескольких местах, поменяв её в 1. Можно, конечно и обычной переменной, но константы инлайнятся, что большой +.

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

Возможно даже стоит сделать так, что константы считает на этапе компиляции, что инлайнились и константы вроде sin(30*Pi*2/180) * 3. Конечно, System.DateTime.Now будет возвращать время компиляции, но я сомневаюсь что подобное сломает совместимость или что то типа того))

Так всё уже сделано

1 лайк

С каких пор Sin() стал пользовательской функцией? Другое дело, я не понимаю, почему после var у Вас const идет.

const
  n = 5;
  x = Sin(n);

begin
  Print(n, x)
end.

Все отлично работает.

Прочитайте внимательнее:

image

Sin - Это не пользовательская, а системная функция. Но и n - не константа

Да, тут n - константа

Более того, и так работает, с пользовательской функцией.

function FF(p: integer): integer;
begin
  Result := p + 1
end;

const
  n = 5;
  x = Sin(n);
  y = FF(n);

begin
  Print(n, x, y)
end.

Да оно и не должно работать, это же не С++, тут раздел описания констант обособлен.

Я силюсь, но не могу понять источника и причин этого “страдания фигнёй”.

У меня пишет Program1.pas(9) : Ожидалось константное выражение

%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA2

Где Вы такую древнюю версию взяли? :slight_smile: У меня уже сборка 1712!

Вчерашняя - древняя? Вообще-то сегодня днем обновлял)). Вы хотите сказать, “Обновись - пусть и тебе станет хреново !” ?

1 лайк

Ну так @Admin написал тот комментарий (который можно найти по ссылке) 2 часа назад а не вчера))

2 лайка

Ну, я баги исправляю не по расписанию, а как исправляется. Константы - был заведомый баг, так что сейчас у Вас версия с багом. Всё равно завтра обновитесь :rofl:

Ну, если надо - вот мой авто установщик паскаля. Сам скачивает, сам запускает. К сожалению, я не нашёл как запустить в беграунд-режиме, но там только пару раз нажать “далее” и всё, это вся установка.

1 лайк

Спасибо, уже поставил новую версию, теперь мы мне тоже хреновее стало, исправили баг)))

А если серьезно, мне оно, как внучка моя говорит, “Не шло, ни ехало”. Ибо как мне “Заратустра не позволяет” писать инициализацию констант какими-то своими функциями.

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

Что тут должно быть?

procedure p;
begin
end;

type A = class
  property x: integer write p;
end;

Вы про то, стоит ли выдавать тут ошибку, типа p не принимает параметр value, или воспринимать этот код как property x: integer write begin p end;?