2015-09-23 5 views
0

Если функция a имеет cc в качестве функции CPS, а cc звонки a, есть a продолжение проходить стиль? Например,Продолжение прохождения?

(def a 
    (lambda (b c) 
     ... 
     (a (cons (c (car b))) c))) 

(def cc 
    (lambda (d) 
      ... 
      (fold a x y) 
      (fold a u v) 
... 

(a '((1 2) 3) cc) 

ответ

3

Много кода, написанный на продолжении обходя стиль не строго продолжение ближнего стиль; потому что есть некоторые вызовы, которые не передают их результаты в продолжение. Тем не менее, код, который вы написали, вероятно, не подходит даже для полу-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) 

вы звоните с буквальным списком и с куб.см, которая теперь, по-видимому, определяется как функция. Передающие функции работают с первоклассными функциями, но это не делает его продолжением.

Смежные вопросы