(SICP) В чем разница между функциями и процедурами?

#function #procedure #sicp

#функция #процедура #sicp

Вопрос:

В настоящее время я работаю над структурой и интерпретацией компьютерных программ, изучая как книгу, так и лекции Брайана Харви (который иногда бывает веселым), однако мне еще предстоит по-настоящему понять: «ага! момент» с дифференцированием функций и процедур.

Теперь я провел свое исследование за пределами лекций и чтений и наткнулся на несколько разных сообщений, касающихся этого же вопроса, но все они, похоже, разветвляются на отдельные обсуждения / мнения об истинной интерпретации или устаревших определениях. Общий ответ, который я видел, заключается в том, что функции возвращают значение, а процедуры — нет, однако это мало что проясняет для меня, и у большинства пользователей в этом ответе, похоже, были некоторые аргументы против этого ответа.

Погружаясь в процедуры более высокого порядка в тексте и лекциях, я полностью понимаю концепцию и возможности, которые это делает доступными, однако я в замешательстве, потому что я услышу «Процедуры более высокого порядка» и «Функции более высокого порядка». Брайан Харви также упомянул, что «Процедура более высокого порядка представляет функцию более высокого порядка».

Я понимаю, что две функции ниже — это одна и та же функция, но разные процедуры.

 f(x) = 2x   6
g(x) = 2(x   3)
  

Теперь ниже make-adder упоминается как процедура с числом в качестве формального параметра. Домен сумматора-это числа, диапазон — это процедуры. Я думаю, что меня действительно ставит в тупик то, что он ссылается на лямбда-выражение именно как на лямбда-выражение, но make-adder возвращает процедуру?

 (define (make-adder num)
  (lambda (x) (  x num))

(define plus3 (make-adder 3))
(plus3 8)
  

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

Любая помощь в разграничении двух с возможным примером? Спасибо!

Ответ №1:

TL; DR: Процедура и функция означают одно и то же в контексте SICP.

В математике функция — это то, что вы применяете с аргументами и возвращает значение и всегда возвращаете одни и те же значения одним и тем же аргументам. Вы могли бы заменить его отображением между аргументами результата.

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

Процедура — это более общий термин, поэтому вы не можете сказать, что процедура должна обладать ссылочной прозрачностью, чтобы ее можно было рассматривать как математическую функцию, и, следовательно, как Scheme, так и JavaScript имеют процедуры, а не функции. Например. подпрограмма в платформе Intel x86 — это процедура. Он не допускает аргументов и не возвращает значение, просто переходит и возвращает. Однако C использует код для управления стеком, чтобы иметь возможность передавать аргументы и получать возвращаемое значение, и в этом смысле вы можете эмулировать «функцию», но они не устранили возможность того, что возврат не будет одинаковым для каждого ввода, и, таким образом, вы можете реализовать «функцию c», которая не является функцией, но вы можете назвать ее процедурой.

Комментарии:

1. Спасибо, это действительно помогло. Правильно ли я теперь предполагаю, что многие программисты используют эти термины взаимозаменяемо, когда они действительно не должны?

2. @BenjaminArsenault Я следую соглашению об именовании языка, чтобы избежать путаницы. Например. в Scheme это процедура, в Common Lisp и Racket это функция. Их можно назвать функциями, когда нет наблюдаемых побочных эффектов, и процедурами, когда они есть, но существует множество текстов, в которых используются функции для обоих и используется слово pure для обозначения «реальных» функций.

3. Я ценю, что вы нашли время ответить, это очень помогло.