私は Racket で CPS について学んでおり、これらの関数を書き上げることができました。
;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 つの質問をしたことはわかっていますが、それらすべての背後にある基本的な考え方 (正しく理解しているかどうかはわかりません) は同じです。他の Lisp、Haskell、Erlang、または他の関数型言語での説明は問題ありません。