Хотелось бы уточнить. Любая функция из .dll будет считаться константной? Или только из стандартной .dll?
Да, из любой dll. Надо потестировать ещё.
Идея в том чтобы нельзя было воспроизвести ошибку с константами. А с пользовательскими функциями это можно.
Константы же в могут инициализироваться вызовами стандартных методов из dll, которые возвращают неконстантное значение. Потом их изменить нельзя.
Понять, является ли функция константной, к сожалению невозможно. Нет модификатора const для методов как в C++. Поэтому - пропишем просто эти правила в описании языка: константы расширены насколько возможно но чтобы не было багов.
Ну, лично я считаю что константам не должно быть ограничения что присваивать.
У них есть 2 применения:
- Указать что пунктов нельзя изменять после инициализации. Это сделано чтоб если сам забудешь, или программист, подключивший твою библиотеку не знает - нельзя было что то сломать.
- Чтоб можно было поменять переменную в нескольких местах, поменяв её в 1. Можно, конечно и обычной переменной, но константы инлайнятся, что большой +.
Ни 1 из них не надо чтоб константы были обязательно одинаковы, между запусками программы.
Возможно даже стоит сделать так, что константы считает на этапе компиляции, что инлайнились и константы вроде sin(30*Pi*2/180) * 3
. Конечно, System.DateTime.Now
будет возвращать время компиляции, но я сомневаюсь что подобное сломает совместимость или что то типа того))
Так всё уже сделано
С каких пор Sin() стал пользовательской функцией? Другое дело, я не понимаю, почему после var у Вас const идет.
const
n = 5;
x = Sin(n);
begin
Print(n, x)
end.
Все отлично работает.
Прочитайте внимательнее:
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) : Ожидалось константное выражение
Где Вы такую древнюю версию взяли? У меня уже сборка 1712!
Вчерашняя - древняя? Вообще-то сегодня днем обновлял)). Вы хотите сказать, “Обновись - пусть и тебе станет хреново !” ?
Ну, я баги исправляю не по расписанию, а как исправляется. Константы - был заведомый баг, так что сейчас у Вас версия с багом. Всё равно завтра обновитесь
Ну, если надо - вот мой авто установщик паскаля. Сам скачивает, сам запускает. К сожалению, я не нашёл как запустить в беграунд-режиме, но там только пару раз нажать “далее” и всё, это вся установка.
Спасибо, уже поставил новую версию, теперь мы мне тоже хреновее стало, исправили баг)))
А если серьезно, мне оно, как внучка моя говорит, “Не шло, ни ехало”. Ибо как мне “Заратустра не позволяет” писать инициализацию констант какими-то своими функциями.
Вот, решил обсудить расширенные свойства. Там возникают неприятные неоднозначности
Что тут должно быть?
procedure p;
begin
end;
type A = class
property x: integer write p;
end;
Вы про то, стоит ли выдавать тут ошибку, типа p
не принимает параметр value
, или воспринимать этот код как property x: integer write begin p end;
?