Много кода, написанный на продолжении обходя стиль не строго продолжение ближнего стиль; потому что есть некоторые вызовы, которые не передают их результаты в продолжение. Тем не менее, код, который вы написали, вероятно, не подходит даже для полу-CPS. Точка продолжения прохождения заключается в том, что вместо возврата некоторого результата от функции функция принимает дополнительный аргумент, называемый продолжением, и вызывает эту функцию с «результатом». Например, функция CPS просуммировать элементы списка может выглядеть следующим образом:
(define (sum-list lst k)
(if (null? lst)
;; if the list is empty, then call the continuation
;; with the sum of the empty list, i.e., zero.
(k 0)
;; Otherwise, compute the sum of the rest of the list,
;; but with a different continuation that will take
;; the sum of the rest of the list, add the first
;; element of the list, and call the original continuation,
;; k, with that combined sum.
(sum-list (cdr lst)
(lambda (sum)
(k (+ (car lst) sum))))))
Это не строго КПС, хотя, так как некоторые из функций, а именно автомобиля, CDr и + не являются CPS; они возвращают свои результаты своему вызывающему, не называя продолжения результата.
Теперь давайте посмотрим на код, вы при условии:
(def a
(lambda (b c)
...
(a (cons (c (car b))) c)))
В схеме, это было бы написано
(define (a b c)
...
(a (cons (c (car b))) c))
Призыв к против имеет неверное число аргументов , но помимо этого нет четкого вызова функции продолжения. Вы используете c в функциональном положении, поэтому вы используете функции более высокого порядка, и вы делаете рекурсивный вызов a, но это не что-то, что, очевидно, является продолжением стиля прохода. В вашем втором блоке:
(def cc
(lambda (d)
...
(fold a x y)
(fold a u v)
Не совсем понятно, что вы пытаетесь выполнить. Fold не используется в режиме CPS, и вы игнорируете результаты первого вызова для сброса. Здесь нет ничего похожего на стиль CPS. В конечном биту,
(a '((1 2) 3) cc)
вы звоните с буквальным списком и с куб.см, которая теперь, по-видимому, определяется как функция. Передающие функции работают с первоклассными функциями, но это не делает его продолжением.