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


#21

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


#22

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


#23

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

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

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


#25

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

function f1 := 1;

procedure p0(x: integer) := exit;

begin
  var f: ()->integer := f1;
  
  var x: integer := f;
  p0(f);
  
end.

То есть если тип переменной совпадает с тем, что возвращает процедурная переменная - это всё же вызов. Иначе нужны лишние пустые скобочки в элементарных ситуациях.


#26

А сравнение с nil? Если функция описана, например лямбдой, но пока не определена, программа слетит при попытке вычисления значения. А тогда как проверить, было ли определение?


#27

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


#28
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.

#29

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


#30

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


#31

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


#32

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


#33

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


#34

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


#35

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


#36

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

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

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

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


#37

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


#38

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


#39

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


#40

+ 1 исключение, лучше напишу сюда чтоб не потерялось:

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

begin
  var f1: ()->integer := f0;
  
  var o := f1; // получения ссылки
  
end.

Потому что

Здесь o сохраняет тип f1, что естественно при автовыводе


#41

Это и так работает именно так. Вы пишите, что работает не по этой спецификации. Вдруг мы что упустили