LINUX.ORG.RU

FreePascal вычисление параметров WriteLn

 ,


0

1

Пишу несложную программу:

program test;

function add(c1, c2 : integer) : integer;
begin
  add := c1 + c2;
  WriteLn('test');
end;

begin
  WriteLn('Hello world ', add(1, 2));
end.

ожидаю получить вывод:

test
Hello world 3

получаю

Hello world test
3

Почему так? Такое ощущение что второй параметр вычисляется не перед вызовом WriteLn, а как-то лениво. В документации про ленивость ничего найти не смог, вижу только value parameters / variable parameters, то есть по сути либо по ссылке либо по значению, но передаться параметры должны сразу же.


Почему ты ожидаешь, что функция выполнится на этапе объявления, а не в момент выполнения? Всё правильно оно тебе написало.

shell-script ★★★★★
()

А почему 3 выводится, когда её никто не просит?

Мимо паскаль забыл в 11 классе.

EXL ★★★★★
()
Ответ на: комментарий от shell-script

Я думаю, что он ожидал, что сначала вызовется add(1,2), результат сохранится во временную переменную, а потом вызовется WriteLen со строкой и временной переменной.

deadskif
()

Сам не в курсе, но злые языки говорят, что

Write/WriteLn - это не функция, а макрос

Тогда это объясняет поведение и неоправданные ожидания.

Ivana
()
Ответ на: комментарий от shell-script

Вообще в большинстве языков при вызове функции (в нашем примере это WriteLn внутри begin/end-блока) ожидается, что сначала в каком-либо порядке будут вычислены их аргументы ('Hello world ' и add(1, 2)), а затем уже вычисленные значения будут переданы в функцию.

// pascal-не-знаю-мимокрокодил

theNamelessOne ★★★★★
()
Ответ на: комментарий от EXL

Возвращаемле значение. Это функция, а не процедура.

Правильно кстати выдало.

a1batross ★★★★★
()
Ответ на: комментарий от theNamelessOne

То бишь ТС ожидал что-то такое:

#include <stdio.h>

int add(int c1, int c2) {
  int ret = c1 + c2;
  puts("test");
  return ret;
}

int main(void) {
  printf("Hello world %d\n", add(1, 2));
  return 0;
}
theNamelessOne ★★★★★
()
Ответ на: комментарий от deadskif

Таки макросы:

program ideone;

function add(c1, c2 : integer) : integer;
begin
  add := c1 + c2;
  WriteLn('test');
end;

function tst(c1 : string; c2 : integer) : integer;
begin
  WriteLn(c1, c2);
  tst := 0;
end;

begin
  tst('Hello world ', add(1, 2));
end.
ТС курить функции/макросы в плане аппликативный/нормальный порядок редукции.

Ivana
()
Ответ на: комментарий от Ivana

Я присмотрелся, и мне теперь тоже так кажется... Ну значит WriteLn выполняется поочередно, сначала вывел текст, потом пошел в функцию там опять текст, закончил на цыфорке...

I-Love-Microsoft ★★★★★
()

Write[Ln] это не функция, она разворачивается компилятором в последовательность «подфункций», ненадо проверять последовательность вычисления параметров на ней. Проверяйте на своей add или на

function MyWriteLn(s:string) : integer;
begin
  WriteLn(s);
end;

zamtmn ★★
()
Последнее исправление: zamtmn (всего исправлений: 3)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.