计划如何在一个条款中测试2个条件?

时间:2009-10-16 05:44:33

标签: scheme

我需要创建一个子函数,它将返回我在Scheme中this question所需的所有相邻节点。我是计划新手,不确定如何将两个条件合并为一个测试用例?

基本上我的算法是测试节点是否在边缘。这种情况我使用5x5网格。

如果两个节点都在拐角处意味着两者都等于1或5,那么我将只有2个相邻节点。 如果只有一个节点被击中边缘,我将有3个节点返回值。 如果节点周围没有边缘,我将返回4个节点。

我的问题是如何将2个测试用例放在一个子句中?

(define (neighbors l w)
  (if (= 1 l) and (= 1 w)
      (display l w))) --at top left corner

这里我想评估l和w是否都等于1.现在这不起作用,因为我不能在语法中使用“和”或“或”这样的关键字,我也不能使用&或者+来组合它们。有任何想法吗 ?或者我应该做点什么?

2 个答案:

答案 0 :(得分:8)

你试过这个:

(define (neighbors l w)
  (if (and (= 1 l) (= 1 w))
     (display l w))) --at top left corner

因为当我查看this时,它似乎是那样工作的

答案 1 :(得分:3)

,除非 更方便,当条件只有一个分支时:

(define (neighbors l w)
  (when (and (= 1 l) (= 1 w))
     (display l) 
     (display #\space) 
     (display w) 
     (newline)))

注意的分支是隐含的开始时,如果 需要显式的开始其分支机构有多种形式。

并非所有Schemes在时都有,除非预定义,因为它们未在R5RS中指定。将它们定义为宏很容易:

(define-syntax when
   (syntax-rules ()
     ((_ test expr1 expr2 ...)
      (if test
      (begin
        expr1
        expr2 ...)))))

(define-syntax unless
  (syntax-rules ()
    ((_ test expr1 expr2 ...)
     (if (not test)
     (begin
       expr1
       expr2 ...)))))