在Scheme中为何出现‘object not applicable’错误?求技术解答
解决Scheme中"object not applicable"错误的方案
你的代码问题出在多余的括号使用上——Scheme里括号的作用是标记函数调用,一旦给普通变量/值加上额外括号,解释器就会尝试把它当成函数来执行,而你的列表元素或子列表显然不是函数,所以触发了"object not applicable"错误。
具体错误点及修正:
空列表判断的括号错误:
原代码:((null? (st1)) #t)
错误原因:(st1)是试图调用st1作为函数,但st1是传入的列表参数,不是函数。
修正为:(null? st1)函数调用的参数传递错误:
原代码:((in? ((car st1) st2)) (subset? ((cdr st1) st2)))
错误原因:((car st1) st2)是把(car st1)当成函数调用,传入st2作为参数,但(car st1)是列表的元素,不是函数;同理((cdr st1) st2)也是错误地把剩余列表当成函数。
修正为:(in? (car st1) st2)和(subset? (cdr st1) st2)
修正后的完整代码:
(define subset? (lambda (st1 st2) (cond ((not (set? st1)) (error "Your first argument is not a set!")) ((not (set? st2)) (error "Your second argument is not a set!")) ((null? st1) #t) ((in? (car st1) st2) (subset? (cdr st1) st2)) (else #f) ) ) )
额外说明:
假设in?是你已经定义好的、用来检查元素是否在集合中的函数(比如通过遍历集合判断存在性),修正后的代码就能正常递归判断st1是否是st2的子集了。
内容的提问来源于stack exchange,提问作者bengongon97
相关产品推荐
相关产品推荐

