Вечный (но лучше нет) вопрос функции без скобочек и параметров

Что вы имели в виду под этим?

Когда писал, думал немного о другом. Для функций это неактуально, только для процедур. Поправил.

Мы активно для школьников используем это: var Right2 := Right + Right; Так что процедуры без скобочек не имеют проблем функций без скобочек

Если использовать для функций что-то вроде p:=f1; p+=f2; p+=f3; … p+=fn; это окажется эквивалентным записи в p просто fn, т.е. результаты предшествующих вызовов потеряются. Посему, смысла нет. Ну разве только если каждая функция будет еще с побочным эффектом, но это фигня, тогда правильнее использовать процедуры.

Я предлагаю простое описание.

Имя функции без скобочек трактуется как ссылка только когда присваивается процедурной переменной или передается как параметр в качестве процедурной переменной. В остальных случаях - вызов.

Процедурная переменная типа функции без параметров без скобочек всегда означает ссылку.

1 лайк

А как насчёт всё же разрешить это:

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.

Про процедурные переменные @Admin отдельно сказал:

Процедурные переменные, хранящие функции без параметров, записываемые без скобочек, всегда означают ссылку. Должны. Сейчас видимо не так - надо переделывать. Если кто-то возьмется выявить все такие случаи - буду признателен

Я с радостью. Но для начала, всё же, ответьте на это. Описать в виде правила это изи, ибо это то же самое что и получение ссылки из имени функции (то есть НЕ из процедурной переменной), только в обратную сторону.

Я ответил. Повторю еще раз. С моей точки зрения исключений быть не должно.

2 лайка

В хорошем языке программирования выбор должен делаться в пользу однозначности. Чем меньше исключений и оговорок - тем надежнее язык из-за уменьшения шанса получить неожиданное поведение программы.

Какие ещё есть различные случаи?

Мы согласовали позицию по процедурным переменным. Скобочки у процедурных переменных типа функций без параметров ведут себя так же, как и для функций без параметров за одним исключением - при сравнении с nil это не вызов, в ссылка.

А сравнение с другой процедурной переменной того же типа?

function f0: integer;
begin
  writeln('f0');
end;

begin
  var f1: ()->integer;
  var f2: ()->integer;
  writeln(f1=f2);
end.

Тут ведь тоже нужно чтоб была ссылка, что насчёт этого?
(сейчас работает именно как получение ссылки)

И тогда так значит:

Там всё правильно

Да, согласен. Ну вроде так сейчас и работает