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

时间:2009-12-30 03:24:15

标签: functional-programming scheme

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

谢谢。

1 个答案:

答案 0 :(得分:2)

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

所以(and (expression_1) ... (expression_N))会在找到第一个错误表达后立即返回#f

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

宏不评估他们的论点,他们只是在评估之前重写术语。您可以利用它来创建控制结构,如if / cond /或/,只要您已经有一个可以使用它们。实际上,因为lambda体在被调用之前不会被计算,所以你真正需要的懒惰评估控制流语句是lambda和宏。

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

这是一个使用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))

用法:

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