在没有宏的情况下使用延迟/强制来实现控制结构?

发布于 2024-08-16 04:59:06 字数 58 浏览 1 评论 0原文

使用Scheme编程语言,如何使用延迟/强制来实现控制结构而不诉诸使用宏设施?

谢谢。

Using Scheme the programming language, how would one use delay/force to implement control structures without resorting to using macro facilities?

Thank you.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

爱人如己 2024-08-23 04:59:06

大多数编程语言都支持不冗余计算参数的控制流结构。

因此,一旦找到第一个错误表达式,(and (expression_1) ... (expression_N)) 就会返回 #f

如果and只是Scheme中的一个函数,那么它的所有参数都会在到达and的实现主体之前被评估。您无法实施它来解决这个问题。

宏不评估它们的参数,它们只是在评估之前重写术语。您可以利用这一点来创建像 if/cond/or/and 这样的控制结构,只要您已经有其中之一可以使用。事实上,由于 lambda 主体在调用之前不会被求值,因此延迟求值控制流语句真正需要的只是 lambda 和宏。

现在,如果您不想使用宏,那么您的参数将被评估。您必须将它们包装在 lambda 中,或者您可以使用延迟/强制。但是这样你就不会将表达式传递到你的控制结构中。你正在传递包裹在某些东西中的表达式。它变得有点难看。

这是一个使用 lambda 的人为示例。

(define bool1
  (lambda ()
    (display "evaluating bool1\n")
    #t))


(define bool2
  (lambda ()
    (display "evaluating bool2\n")
    #t))

(define (_or b1 b2)
  (if (b1) #t
      (if (b2) #t #f)))

(define (_and b1 b2)
  (if (b1) (if (b2) #t #f) #f))

用法:

> (_and bool1 bool2)
evaluating bool1
evaluating bool2
#t
> (_or bool1 bool2)
evaluating bool1
#t
> 

Most programming languages support control-flow structures that don't evaluate arguments redundantly.

so (and (expression_1) ... (expression_N)) would return #f as soon as the first false expression is found.

If and were simply a function in Scheme, all of it's parameters would have been evaluated before getting to the body of and's implementation. There's no way you could implement it to get around this.

Macros don't evaluate their arguments, they just rewrite terms before they get evaluated. You can take advantage of that to create control structures like if/cond/or/and as long as you have one of them to work with already. In fact, because a lambda body isn't evaluated until called, all you really need for lazily evaluated control flow statements are lambda and macros.

Now, if you don't want to use macros, then your arguments will be evaluated. You have to wrap them up in lambdas, or you can use delay/force. But then you aren't passing expressions into your control structure. You're passing in expressions wrapped in something. It gets kinda ugly.

Here is a contrived example using lambdas.

(define bool1
  (lambda ()
    (display "evaluating bool1\n")
    #t))


(define bool2
  (lambda ()
    (display "evaluating bool2\n")
    #t))

(define (_or b1 b2)
  (if (b1) #t
      (if (b2) #t #f)))

(define (_and b1 b2)
  (if (b1) (if (b2) #t #f) #f))

usage:

> (_and bool1 bool2)
evaluating bool1
evaluating bool2
#t
> (_or bool1 bool2)
evaluating bool1
#t
> 
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文