Я изучаю CPS с Racket, и мне удалось написать эти функции:
;lift a regular single-arg function into CPS
(define (lift/k f)
(lambda (x k)
(k (f x))))
;compose two CPS functions
(define (compose/k f g)
(lambda (x k)
(g x (lambda (y)
(f y k)))))
Вроде работают корректно
(define (is-two/k x k)
(k (= x 2)))
(define is-not-two/k (compose/k (lift/k not) is-two/k))
(is-not-two/k 3 display)
(is-not-two/k 2 display)
#t#f
Мне интересно, являются ли эти функции по-прежнему «настоящими CPS». Я испортил «настоящую» передачу продолжения с этими функциями? Кошерно ли использовать методы композиции функций в CPS? Это поощряется? Или это будет считаться «компромиссом»? Есть ли более CPS-y способ сделать это?
Да, я знаю, что только что задал 5 вопросов, но основная идея, стоящая за ними всеми (которую я не уверен, что правильно понимаю), одинакова. Объяснения на других Лиспах, Хаскеле, Эрланге или других функциональных языках вполне подойдут.