括号中的值不在方案中评估

时间:2017-09-11 10:21:04

标签: scheme lisp

我想返回等于2的值。如果等于2则为“true”,如果不等于2则为“false”,如果不是数字则为“not” }”。以下是我的代码段。

(define (test mList)
    (if (null? mList)
        '()
        (let ((x (car mList))
                (y (cdr mList)))
        (if (number? x)
            (cond ((= x 2) (cons "true" (test y)))
              ((list? x) (append (test x)
                                    (test y)))
            (else (cons "false" (test y))))
        (cons "not" (test y))))))

(display (test '(b a (2 b) 9 2 2 g)))返回(not not not false true true not)。括号(2 b)中的值计算为1,然后返回not

输出如何如此。 (not not true not false true true not)

我错过了什么?

1 个答案:

答案 0 :(得分:1)

以下是您的代码,其中包含一些注释,可能会说明为什么您不会递归列表中的列表:

(define (test lst)
  (if (null? lst)
      '()                                          ; lst is null
      (let ((a (car lst))                          ; lst is not null
            (d (cdr lst)))
        (if (number? a)
            (cond ((= a 2) (cons "true" (test d))) ; if a is a number and equal to 2
                  ((list? a) (append (test a)      ; if a is a number and not equal to 2 and a list at the same time
                                     (test d)))
                  (else (cons "false" (test d))))  ; if a is a number and not equal to 2 and not a list
            (cons "not" (test d))))))              ; a is not a number

我在这里重命名了一些变量,但它也是如此。

检查元素是否为列表的代码是先前测试的结果,它是一个数字。由于某个号码不能是列表,因此您的列表最终会作为您在列表中添加“not”的替代方式。

列表(2 b)不是数字,因此完全符合您的规范:

  

如果等于2则为“true”,如果不等于2则为“false”,如果不等于a   数字然后“不”

如果谓词和后果被移动到(number? a)的替代,则处理子列表的代码是正确的。例如。

(cond 
  ((list? a) <do list stuff>)             ; a is perhaps a list
  ((not (number? a)) <not number stuff>)  ; a is not a list, perhaps number?
  ((= a 2) <do 2 stuff>)                  ; a not list and is number, perhaps 2?
  (else <do number not 2 stuff>))         ; a is not list and is number and not 2

注意我已经重新排序了一段时间,因为以前的测试是错误的并且可以进行更平坦的案例分析。