2016-01-24 4 views
0

Мне было интересно о очень странном поведении в бесплатных паскальных функциях, described in docs.Почему я могу использовать имя функции в pascal как имя переменной без определения?

Говорят, что следующий код будет скомпилирован/успешно выполнен:

function Test : integer; 
begin 
    Test := 2; 
end; 

begin 
    WriteLn(Test()); 
end. 

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

Таким образом, функции pascal, с одной стороны, определяют переменную с их именем Test и тип возвращаемого значения функции integer. С другой стороны, вы все равно можете вызвать функцию (сделать рекурсивный вызов, используя свое имя).

Почему? Какова цель?

+0

В этом нет ничего плохого. Почему бы вам не сделать рекурсию. Ответственность разработчика за то, чтобы проверить их код, имеет смысл и может правильно закончить –

+0

@DavidBrossard полностью согласился с рекурсией - он поддерживается на самых популярных языках программирования. Я смущен об автоопределенной переменной с именем функции. – avasin

ответ

2

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

Он был представлен в оригинальном синтаксисе Pascal. Позже, чтобы предотвратить неудобства была введена еще одна переменная с именем Result, и это только союз с предыдущим:

Test := 2; 
i := Result + 3; // Here i = 5; 

Таким образом, на данный момент, Test := 2; и Result := 2; такое же.

В случае использования имени функции в правой части уравнения, оно интерпретируется как переменная, а не вызывает функцию:

Test := Test + 1; // Increments Test value 

, но вы все еще можете вызвать функцию рекурсивно с помощью скобок:

Test := Test() + 1; // Recursion 

Итак, у вас есть три способа, чтобы вернуть значение из функции (для примера):

function Test : integer; 
begin 
    Test := 2; // Function result = 2 
    Result := 2; // Same to previous 
    Exit(2); // Sets function result to 2 end exits immediately 
end; 

Это зависит от вас, какой метод использовать.

+0

Ничего себе! Удивительный ответ. Спасибо! – avasin