【问题标题】:Scheme Error: #t is not a function [subset?, (anon)]方案错误:#t 不是函数 [子集?,(匿名)]
【发布时间】:2017-09-26 20:39:25
【问题描述】:

我收到两个错误,我显然不理解这里的某些内容。当输入都是两组时,第一个出现。这是它给我的错误:

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)”与“((null?A)#t)”完全相同 它与子集的事实有关吗?有两个参数?

我正在https://repl.it/languages/scheme 上进行测试,我不确定这是否也会有所作为。

谢谢

【问题讨论】:

    标签: recursion scheme


    【解决方案1】:
    ((is-set? A) and (is-set? S))
    

    方案没有中缀运算符。 (exp exp*) 是函数调用的语法,其中第一个表达式计算为一个函数,然后以其他表达式的值作为参数调用该函数。

    所以上面被解释为一个函数调用,其中(is-set? A) 是函数,and(is-set? S) 是参数。第一个问题是 (is-set? A) 实际上不是一个函数(它是一个布尔值),这是错误消息告诉你的。

    (else #f)
    

    if 不使用 else 关键字。 if 的 else 情况只是作为 if 的第二个表达式给出。也就是说,你应该写(if condition exp1 exp2),而不是(if condition exp1 (else exp2))

    您在第一个函数中没有遇到相同错误的原因是您从不使用非列表调用 is-set?,因此它永远不会到达 else-case 并且永远不会找到错误。

    【讨论】:

    • 谢谢!这有很大帮助。你是对的,这在第一个中不起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    • 2021-01-25
    相关资源
    最近更新 更多