计划成员?功能

时间:2018-01-31 17:54:34

标签: scheme

我在Scheme中创建了member?过程,如下所示:

(define member?
    (lambda (x los)
        (cond
            ((null? los) #f)
            ((if (eq? x (car los)) #t (member? x (cdr los)))))))

我已经完成了几个测试用例,除了(member? 'a '(b c d))没有返回任何内容(或者#<void>确切),我想知道为什么。

代码的初步调试(在第二行添加(display los))表示该过程以递归方式遍历列表,直到它变为空列表'()但不会被{{1 }}

2 个答案:

答案 0 :(得分:2)

您可能想查找如何使用cond

(define member?
  (lambda (x los)
    (cond
      ((null? los) #f)
      ((eq? x (car los)) #t)
      (else (member? x (cdr los))))))

答案 1 :(得分:1)

如果谓词计算为真值,则cond中的谓词唯一术语将评估结果,但如果是假值#f则不计算结果。然后它会进入下一个学期。

如果你有ifcond,并非所有案件都得到处理,那么实施可以选择结果:

(let ((b 4))
  (cond
    ((< b 2) 'less-than-2)
    ((zero? b) 'zero)))
; ==> "https://youtu.be/wd4Oxk11PA0?t=17s"

由于R6RS标准促使实施者有一个对象来表示未指定的值,但Scheme imlementations不需要遵循这些。例如。 MIT Scheme返回旧值而不是set!的未定义值:

(define test 10)
(set! test 20)
; ==> 10 (returns the old binding)