2017-09-26 7 views
0

2つのエラーが表示され、ここで何か分かりません。最初は入力が両方のセットであるときに来る。これは私に与えられるエラーです:スキームエラー:#tは関数ではありません[サブセット?,(anon)]

Error: #t is not a function [subset?, (anon)] 

2番目は、AまたはSがセットではなく、そのelseステートメントです。私はこれを取得:

(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) 

ザ・に設定されて次のように

Error: execute: unbound symbol: "else" [subset?, is-set?] 

私のコードはありますか? "((null?A)#t)"と同じ構文 "((null?L)#t)"を返します。 サブセットとは何か関係がありますか? 2つのパラメータを取るか?

https://repl.it/languages/schemeでこれをテストしていますが、それで違いがあるかどうかわかりません。

おかげ

答えて

1
((is-set? A) and (is-set? S)) 

スキームは、中置演算子を持っていません。 (exp exp*)は関数呼び出しの構文で、最初の式は関数に評価され、他の式の値を引数として呼び出されます。

したがって、上記は関数呼び出しとして解釈され、(is-set? A)が関数であり、andおよび(is-set? S)が引数です。その最初の問題は、(is-set? A)が実際には関数ではないことです(これはブール値です)。これはエラーメッセージがあなたに伝えているものです。

(else #f) 

ifelseキーワードを使用していません。 ifのelse caseは、2番目の式としてifに与えられます。つまり、(if condition exp1 (else exp2))の代わりに(if condition exp1 exp2)と書く必要があります。

最初の関数で同じエラーが発生しない理由は、is-set?を非リストで決して呼び出さないため、else-caseに決して到達せず、エラーを検出しないためです。

+0

ありがとうございます!これは多くの助けとなりました。そして、あなたは正しい、それは最初のもので動作しませんでした。 – Penrose5833