Отрывок из ответ на аналогичный вопрос ...
Параметры и локальные переменные размещаются в стеке (со ссылочными типами объект живет в куче, а переменная ссылается на этот объект). Стек обычно располагается в верхнем конце вашего адресного пространства и по мере его использования он направляется к нижней части адресного пространства (т. Е. К нулю).
У вашего процесса также есть куча, которая находится в нижней части вашего процесса. По мере выделения памяти эта куча может увеличиваться в направлении верхнего края вашего адресного пространства. Как видите, существует вероятность того, что куча «столкнется» со стеком (что-то вроде техтонических пластин !!!).
Ошибка переполнения стека означает, что стек (ваша подпрограмма) переполнен (выполнялся сам столько раз, что падал). Ошибки переполнения стека обычно возникают из-за плохого рекурсивного вызова (в случае AppleScript - неправильного вызова подпрограммы).
Как правило, если ваши подпрограммы возвращают значения, убедитесь, что значение не является именем подпрограммы. В противном случае стек переполнится, что приведет к сбою вашей программы (если оператор return находится не внутри блока try
). Просто измените это:
return calculate_result(this_result)
... к этому
return this_result
... и тебе надо идти!
В некоторых случаях можно возвратить имя подпрограммы, но только если есть условие завершения. Например, если пользователь ввел недопустимый номер, подпрограмма может перезапустить себя, но только в том случае, если номер недействителен (показано ниже):
on get_input()
set this_number to null
try
set this_number to the text returned of (display dialog "Please enter a number:" default answer "") as number
on error --the user didn't enter a number and the program tried to coerce the result into a number and threw an error, so the program branches here
return get_input()
end try
return this_number
end get_input
В вышеприведенном случае условие завершения возникает, когда пользователь вводит фактическое число. Обычно вы можете сказать, когда программа выдаст ошибку переполнения стека, потому что нет завершающего условия.
Надеюсь, эта информация поможет!