Scheme:避免调用一个过程来获取延续?(Scheme: Avoid to invoke a procedure in order to grab a continuation?)
所以我有这个代码如下:
(define escape (lambda () (set! halt (call/cc (lambda (k) k))) 0)) (define multiply (lambda (l) (if (null? l) 1 (if (zero? (car l)) (halt halt) (* (car l) (multiply (cdr l)))))))我不得不重新设计“繁殖”以避免“逃跑”并获得延续的价值,以便“停止”返回答案的价值。我想出了这个解决方案,它看起来如何?
(define multiply (lambda () (let ((result (call/cc (lambda (k) (set! halt k) '())))) (if (procedure? halt) (tester ((multiply (lambda (k) (if (= k 0) (halt k) (multiply (* k 1)))))) (result 1)) halt))))So I had this code below :
(define escape (lambda () (set! halt (call/cc (lambda (k) k))) 0)) (define multiply (lambda (l) (if (null? l) 1 (if (zero? (car l)) (halt halt) (* (car l) (multiply (cdr l)))))))and I had to redesign "multiply" to avoid "escape" and grab a value of the continuation,so that "halt" returns the value of the answer I come up with this solution how is it look?
(define multiply (lambda () (let ((result (call/cc (lambda (k) (set! halt k) '())))) (if (procedure? halt) (tester ((multiply (lambda (k) (if (= k 0) (halt k) (multiply (* k 1)))))) (result 1)) halt))))最满意答案
你只是想用call/cc写一个早期返回的乘法函数吗?
(define multiply (lambda (l) (call/cc (lambda (k) (let loop ([l l]) (cond [(null? l) 1] [(= 0 (car l)) (k 0)] [else (* (car l) (multiply (cdr l)))]))))))Are you just trying to write an early-returning multiply function using call/cc?
(define multiply (lambda (l) (call/cc (lambda (k) (let loop ([l l]) (cond [(null? l) 1] [(= 0 (car l)) (k 0)] [else (* (car l) (multiply (cdr l)))]))))))更多推荐
发布评论