我收到两个错误,我明白在这里没有理解。第一个是输入是两组的时候。这是它给我的错误:
Error: #t is not a function [subset?, (anon)]
第二个是A或S不是一个集合而它是else语句。我明白了:
Error: execute: unbound symbol: "else" [subset?, is-set?]
我的代码如下:
(define (is-set? L)
(if (list? L)
(cond
((null? L) #t)
((member (car L)(cdr L)) #f)
(else (is-set? (cdr L)))
)
(else #f)
)
)
(define (subset? A S)
(if ((is-set? A) and (is-set? S))
(cond
((null? A) #t)
((member (car A) S)
(subset? (cdr A) S))
(else #f))
(else #f))
)
(subset? '(1 3 5) '(1 2 3 5 6))
;;(subset? '(1 3 5) 1)
是不是?函数有效并且具有完全相同的语法“((null?L)#t)”as“((null?A)#t)” 它与子集的事实有关吗?需要两个参数?
我正在https://repl.it/languages/scheme对此进行测试,我不确定这是否会产生影响。
感谢
答案 0 :(得分:1)
((is-set? A) and (is-set? S))
Scheme没有中缀运算符。 (exp exp*)
是函数调用的语法,其中第一个表达式求值为一个函数,然后使用其他表达式的值作为参数调用该函数。
因此,上述内容被解释为函数调用,其中(is-set? A)
是函数,and
和(is-set? S)
是参数。第一个问题是(is-set? A)
实际上不是一个函数(它是一个布尔值),这是错误消息告诉你的。
(else #f)
if
不使用else
关键字。 if
的else案例仅作为if
的第二个表达式给出。也就是说,您应该写(if condition exp1 (else exp2))
。
(if condition exp1 exp2)
您没有遇到与第一个函数相同的错误的原因是您从不使用非列表调用is-set?
,因此它永远不会到达else-case并且永远不会发现错误。< / p>