Что вы имели в виду под этим?
Когда писал, думал немного о другом. Для функций это неактуально, только для процедур. Поправил.
Мы активно для школьников используем это: var Right2 := Right + Right; Так что процедуры без скобочек не имеют проблем функций без скобочек
Если использовать для функций что-то вроде p:=f1; p+=f2; p+=f3; … p+=fn; это окажется эквивалентным записи в p просто fn, т.е. результаты предшествующих вызовов потеряются. Посему, смысла нет. Ну разве только если каждая функция будет еще с побочным эффектом, но это фигня, тогда правильнее использовать процедуры.
Я предлагаю простое описание.
Имя функции без скобочек трактуется как ссылка только когда присваивается процедурной переменной или передается как параметр в качестве процедурной переменной. В остальных случаях - вызов.
Процедурная переменная типа функции без параметров без скобочек всегда означает ссылку.
А как насчёт всё же разрешить это:
function f1 := 1;
procedure p0(x: integer) := exit;
begin
var f: ()->integer := f1;
var x: integer := f;
p0(f);
end.
То есть если тип переменной совпадает с тем, что возвращает процедурная переменная - это всё же вызов. Иначе нужны лишние пустые скобочки в элементарных ситуациях.
А сравнение с nil? Если функция описана, например лямбдой, но пока не определена, программа слетит при попытке вычисления значения. А тогда как проверить, было ли определение?
Приведите код. Не забудьте, что лямбдой может быть описана только процедурная переменная
procedure t(p: () -> integer);
begin
if p = nil then Println('nil')
else Println(p)
end;
begin
var f: () -> integer;
t(f);
Println(f); // если бы вычислялось:
// Ошибка времени выполнения:
// Ссылка на объект не указывает на экземпляр объекта.
f := () -> 1;
t(f);
Println(f)
end.
Процедурные переменные, хранящие функции без параметров, записываемые без скобочек, всегда означают ссылку. Должны. Сейчас видимо не так - надо переделывать. Если кто-то возьмется выявить все такие случаи - буду признателен
Я с радостью. Но для начала, всё же, ответьте на это. Описать в виде правила это изи, ибо это то же самое что и получение ссылки из имени функции (то есть НЕ из процедурной переменной), только в обратную сторону.
Я ответил. Повторю еще раз. С моей точки зрения исключений быть не должно.
В хорошем языке программирования выбор должен делаться в пользу однозначности. Чем меньше исключений и оговорок - тем надежнее язык из-за уменьшения шанса получить неожиданное поведение программы.
Какие ещё есть различные случаи?
Мы согласовали позицию по процедурным переменным. Скобочки у процедурных переменных типа функций без параметров ведут себя так же, как и для функций без параметров за одним исключением - при сравнении с nil это не вызов, в ссылка.
А сравнение с другой процедурной переменной того же типа?
function f0: integer;
begin
writeln('f0');
end;
begin
var f1: ()->integer;
var f2: ()->integer;
writeln(f1=f2);
end.
Тут ведь тоже нужно чтоб была ссылка, что насчёт этого?
(сейчас работает именно как получение ссылки)
И тогда так значит:
Там всё правильно
Да, согласен. Ну вроде так сейчас и работает