刚学Scheme,运行自定义mem函数报错1不是函数,求问题原因
问题修复说明
- 直接报错原因:你代码里调用函数时用了中文全角单引号
’,不符合Scheme语法要求的半角单引号'。解析器无法识别这个引号的转义功能,会把(1)识别为调用数字1作为函数执行,因此抛出Error: 1 is not a function报错。 - 逻辑错误1:参数传递顺序颠倒。你定义的
mem函数第一个入参是待遍历的列表lst,第二个入参是要查找的目标元素ele,你调用时把两个参数的位置写反了,就算引号修正后也无法得到正确结果。 - 逻辑错误2:相等判断函数选型错误。
=仅支持数值类型的相等比较,如果你需要兼容非数值类型的查找场景,建议改用通用相等判断函数equal?。
修正后可正常运行的代码
(define (mem lst ele) (cond ; 列表为空时返回false ((null? lst) #f) ; 首个元素和目标元素相等返回true,否则递归遍历剩余列表 (else (if (equal? ele (car lst)) #t (mem (cdr lst) ele))))) ; 调用示例:查找1是否存在于列表(1 4 -2)中 (mem '(1 4 -2) 1)
上述代码运行结果为#t,符合预期逻辑。
内容的提问来源于stack exchange,提问作者student
相关产品推荐
相关产品推荐

