"Кто-нибудь знает причины, по которым Джулия выбрала схему функций, в которой параметры, заданные в качестве входных данных, не могут быть изменены?"спросил Schemer
Ваш вопрос неправильный, потому что вы принимаете неправильные вещи.
- Параметры являются переменными
Когда вы передаете вещи в функцию, частоэти вещи являются значениями, а не переменными.
например:
function double(x::Int64)
2 * x
end
Теперь, что происходит, когда вы вызываете его, используя
double(4)
В чем смысл функцииизменить его параметр х, это бессмысленноКроме того, функция не знает, как она вызывается.
Кроме того, Джулия построена для скорости.
Функцию, которая изменяет свой параметр, будет сложно оптимизировать, посколькувызывает побочные эффекты.Побочным эффектом является то, что процедура / функция изменяет объекты / вещи вне ее области действия.
Если функция не изменяет переменную, являющуюся частью ее вызывающего параметра, вы можете быть в безопасности, зная.
- значение переменной не будет изменено
- результат функции можно оптимизировать до постоянной
- без вызова функции не будет нарушаться поведение программы
Эти три фактора делают ФУНКЦИОНАЛЬНЫЙ язык быстрым, а НЕ ФУНКЦИОНАЛЬНЫМ - медленным.
Кроме того, когда вы переходите в параллельное программирование или многопоточное программирование, вы абсолютно НЕ ХОТИТЕ переменную, у которой изменилось значениебез вас (программиста) об этом знать.
"Как бы вы реализовали предложенный макрос, функцию F (x), которая возвращает логическое значение и изменяет c на c: = c + 1. F можетиспользоваться в следующем фрагменте кода Ada: c: = 0; F (c) Loop ... End Loop; "спросил Schemer
Я бы написал
function F(x)
boolean_result = perform_some_logic()
return (boolean_result,x+1)
end
flag = true
c = 0
(flag,c) = F(c)
while flag
do_stuff()
(flag,c) = F(c)
end
"К сожалению, нет, потому что, и я должен был сказать, что c должен снова принять значение 0, когда F возвращает значение False (cувеличивается до тех пор, пока Loop живет и возвращается к 0, когда он умирает. "сказал Schemer
Тогда я написал бы