scheme/racketはprefixという表記法を使用しているため、適用されているプロシージャーはすべて開き角かっこで囲まれています。(function-name arg1 arg2 ...)
。
これはcar(n)
、cdr(n)
、even-list(...)
などが不正な構文であり、それぞれ(car n)
、(cdr n)
、(even-list ...)
などに置き換えなければならないことを意味します。
あなたの手順even-list
に変更を行う場合、単純に
even-list (list 1 2 3 4 5 6 7 8 9 10)
を書いて、あなたが/バインドしてもしなくてもよい(even-list
)識別子を呼び出しているので、あなたは、出力の変更が表示されない理由でもあります(この場合は関数定義にバインドされています)、式(list 1 2 3 4 5 6 7 8 9 10)
です。この式はリストの出力を返します。even-list
の変更は、実際にはプロシージャの引数として渡されずに、list
ビルトインを使用して適用されているため、このリストに反映されません手順。
あなたが行を修正したら:
(even-list (list 1 2 3 4 5 6 7 8 9 10))
あなたの手順のロジックから生じるエラーに気づき始めます。たとえば、recursive関数には基数がありません。つまり、関数がリスト内で再帰的に0の要素のリストに到達すると、(car n)
を適用しようとします。これは、car
の契約違反です。引き数としてpair?
。
は、次のことを考えてみましょう:
(define (even-list lst)
(cond
((null? lst) empty) ; base case (empty? list)
((even? (car lst)) ; even? first element
(cons (car lst) (even-list (cdr lst))))
(else (even-list (cdr lst)))))
または、ビルトイン使用してfilter
手順:
(define (even-list lst)
(filter even? lst))
有効なスキーム/ラケットではありません...質問を投稿する前に構文エラーを修正します。 – naomik