Scheme:避免调用一个过程来获取延续?(Scheme: Avoid to invoke a procedure in order to grab a continuation?)

编程入门 行业动态 更新时间:2024-10-25 04:18:04
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)))]))))))

更多推荐

本文发布于:2023-08-01 04:05:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1353833.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:过程   invoke   Avoid   Scheme   grab

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!