Так спасибо за примеры НСС. Я просмотрел несколько более простых. Итак, «что в этом плохого?» - без (leave '())
в get-first
.
Короткий ответ:
Обратите внимание, что из моего кода
I) leave
всегда будут воссозданы каждый раз, когда мы называем get-first
или get-next
. Он вернется либо к get-first
, либо к get-next
.
ii) fill
будет представлять собой цепочку в зависимости от предыдущего fill
, и она всегда будет возвращаться к get-first
.
Пример
Входной сигнал: '(1)
Итак, мы начинаем путем оценки get-first
на '(1)
.
я) установить leave
II) начинают (waddle '(1)
III), поскольку 1
представляет собой атом, поэтому установить fill
быть продолжением тока. Обратите внимание, если мы используем fill
, тогда он пойдет делать (waddle (cdr l))
, затем он вернется к get-first
. iv) возврат к get-first
с использованием leave
с возвратным значением 1
.
Затем мы переходим к eval (T? 1)
, который, в свою очередь, будет запускать get-next
.
я) установить leave
II) запустить fill
III) начать (waddle '())
IV) возвращают ()
из waddle
, затем вернитесь в get-first
.
Примечание
1) Если мы не имеем (leave '()
, то get-first
вернется '()
, то two-in-a-row*
возвращение #f
. Поэтому мы можем получить тот же ответ, но поведение не то, что мы хотим.
2) Если у нас есть это, то обратите внимание, что leave
теперь leave
создатель: get-next
, поэтому он переводит '()
в get-next
.
3) При создании более 1 ввода в списке, когда мы создаем fill
, он будет создан на основе предыдущего fill
, таким образом результат будет цепочкой, зависящей от предыдущего fill
.
Привет, вопросы на SO должны действительно быть самодостаточными. Вы должны хотя бы объяснить словами, что эта функция должна делать; и, возможно, покажет его ожидаемый выход для ввода образца. –