Форум «Всё о Паскале» _ Теоретические вопросы _ Функция, которая не является функцией
Автор: Vinchkovsky 3.11.2008 22:48
Рассмотрим такую функцию:
function Ax(var b:integer):integer; begin b:=1; Ax:=1 end;
А теперь отвлечемся от Паскаля (условно ).
С общей точки зрения кусок кода в примере - функция, процедура или функционально-процедурный мутант?
Спасибо за аргументированные ответы
Автор: Archon 3.11.2008 23:09
Можно ли считать функцией обособленный кусок кода, принимающий параметр, изменяющий его и возвращающий некоторое значение? Определённо.
Автор: Vinchkovsky 3.11.2008 23:17
Archon, спасибо за ответ, тогда слова предподавателя о том, что функция возвращает одно значение, а процедура много, неверны?
Еще раз отмечу, что речь идет об основных понятиях программирования, не привязанных к конкретному языку
Автор: volvo 3.11.2008 23:25
Цитата
слова предподавателя о том, что функция возвращает одно значение, а процедура много, неверны?
Не в этом отличие процедуры от функции... А в том, что возвращаемое функцией значение можно использовать непосредственно в выражении. С процедурой такое не пройдет...
P.S. То, что ты привел - это функция с побочным эффектом, кстати...
Автор: Archon 3.11.2008 23:31
В общем случае неверны. По идее процедура вообще не возвращает значения. Она может это делать только опосредованно: для Паскаля через var-параметры, например. Функция это тоже может делать. За подробностями сюда: http://ru.wikipedia.org/wiki/%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)
Автор: Vinchkovsky 3.11.2008 23:37
Цитата
Не в этом отличие процедуры от функции... А в том, что возвращаемое функцией значение можно использовать непосредственно в выражении. С процедурой такое не пройдет...
Понятно, так и отвечал предподавателю, он сказал, что это неверно и выдвинул свою версию. Я ему показал функцию, как в примере, на что он ничего внятного не ответил, сославшись на спешку.
Поэтому и решил уточнить, все ли функции в Паскале есть функциями
Возможно, все это звучит странно; дополнительно сбили с толку слова местного "гения" о том, что функции такого виду по определению ни функции ни процедуры (хотя, если уж так и мыслить, то это процедуры).
Спасибо за ответ, который расставил все точки над ''i'' окончательно
Archon, спасибо за ссылку; видно, предподаватель ошибся, хотя, возможно, хоте все пояснить понятно.
Автор: Vinchkovsky 4.11.2008 15:20
Читаю в книге:
Цитата
Если алгорит выдает одно значение ... то такой алгоритм может быть алгоритмом-функцией, если выдает много значений ... алгоритмом-процедурой
Если утверджение верно, то в Паскале процедура выдает значение через var-параметры. Но тогда и функция может возвращать сколько угодно значений через var-параметры?
Единственное логичное объяснение вижу в различии понятий "выдает" и "возвращает", хотя это звучит несколько бредово и предподаватель оперировал вторым понятием .
Автор: volvo 4.11.2008 15:30
Цитата
Если алгорит выдает одно значение ... то такой алгоритм может быть алгоритмом-функцией, если выдает много значений ... алгоритмом-процедурой
Перефразируем: Если алгоритм выдает одно значение, он может быть реализован функцией. Если выдает много значений, то функцией (в чистом виде, без side-effects) он быть не может... И вот тогда уже он может быть реализован либо функцией, либо процедурой. Так понятнее?
Цитата
Но тогда и функция может возвращать сколько угодно значений через var-параметры?
Может. В качестве побочного эффекта, повторяю. Но не должна. А одно - должна вернуть...
Автор: Vinchkovsky 4.11.2008 21:08
Спасибо за помощь, писал сообщение в спешке, хорошо не подумал, уже в дороге вспомнил о побочном эффекте. Немного запутала фраза с Википедии:
Цитата
Особенность, отличающая ее от процедур, состоит в том, что функция возвращает значение, ... .
Я понял, что функция возращает одно значение, процедура не возращает + каждая из подпрограм может это делать опосредственно. Видимо, на самом деле имелось ввиду, что что функция обязательно возвращает значение, в отличии от процедуры, которая может это делать.
Спасибо за помощь (на практике все понимаю, в теории же хотелось разобраться).
Автор: Lapp 5.11.2008 6:09
Цитата(Vinchkovsky @ 4.11.2008 18:08)
на практике все понимаю, в теории же хотелось разобраться).
Ты писал где-то выше, что вопрос носит абстрактный характер, не привязанный к языку, но потом все же речь шла только о Паскале. Да, в Паскале фукнкция - это процедура, возвращающая значение. Иными словами, функиональность функции больше, чем процедуры. В языке Си процедур вообще нет, но зато в понятие функции внесено усовершенстовование: она не обязательно должна возвращать значение. Это еще раз показывает, что между функцией и процедурой отличия не принципиального, а чисто технического характера: функцию иногда удобнее использовать для вычисления параметров выражения.