我在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 }}
答案 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
则不计算结果。然后它会进入下一个学期。
如果你有if
或cond
,并非所有案件都得到处理,那么实施可以选择结果:
(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)