В традиционная рекурсия , типичная модель - то, что Вы выполняете свои рекурсивные вызовы сначала, и затем Вы берете возвращаемое значение рекурсивного вызова и вычисляете результат. Этим способом Вы не получаете результат своего вычисления, пока Вы не возвратились из каждого рекурсивного вызова.
В хвостовая рекурсия , Вы выполняете свои вычисления сначала, и затем Вы выполняете рекурсивный вызов, передавая результаты Вашего текущего шага к следующему рекурсивному шагу. Это приводит к последнему оператору, являющемуся в форме (return (recursive-function params))
. В основном, возвращаемое значение любого данного рекурсивного шага совпадает с возвращаемым значением следующего рекурсивного вызова .
последствие этого - то, что, как только Вы готовы выполнить свой следующий рекурсивный шаг, Вам больше не нужен текущий стековый фрейм. Это допускает некоторую оптимизацию. На самом деле, с соответственно записанным компилятором, у Вас никогда не должно быть переполнения стека хихиканье с рекурсивным вызовом хвоста. Просто снова используйте текущий стековый фрейм для следующего рекурсивного шага. Я вполне уверен, Lisp делает это.
Я не уверен, но evdev может делать такие вещи . Например, он может имитировать нажатие на клавиатуру при нажатии кнопки мыши (прокрутка вверх / вниз также является кнопкой). Возможно, можно будет выполнять горизонтальную прокрутку (возможно, с помощью стрелок влево / вправо на клавиатуре?).