I
Size: a a a
I
PS
I
PS
PS
AT
PS
AT
PS
AN
PS
(define gcd (m n)Очевидно, что вызов gcd здесь хвостовой. Теперь давайте получим промежуточное стековое представление. Причем, используем оптимизацию для if (поменяем if и else части местами, чтобы избежать лишней проверки):
(if (= n 0)
m
(gcd n (mod m n))))
Enter('gcd', ['m', 'n'])Вот и проблема. Вызов оказался где-то в центре кода скомпилированной функции, а главное, за ним не следует Return.
Load('n')
Jump0(0)
Load('n')
Load('m')
Over()
Op('mod')
Call('gcd')
Jump(1)
Label(0)
Load('m')
Label(1)
Return()
Enter('gcd', ['m', 'n'])
Load('n')
Jump0(0)
Load('n')
Load('m')
Over()
Op('mod')
TCall('gcd')
Label(0)
Load('m')
Return()
K
PS
D
A
D
D
D
PS
A