Schemeでオブジェクトと式を取り込む関数を作成するという質問をしています。たとえば、(foo 'x '(x 10 x x 4))
と指定されたオブジェクトに続くすべてのオブジェクトを返す必要があります。上記の関数呼び出しは(10 x 4)
を返します。ただし、式にはリストを含めることもできます。たとえば、(foo 'y '(y (3 y 5 y y 8 9) (10 y 12 13 y 15 y) 17))
は((3 y 5 y y 8 9) 5 y 8 12 15)
を返します。彼らがリストを含んでいるとき、私は問題を抱えています。ここまでは私のコードです。式がリストに含まれている場合 リストを含む式をループするスキーム
(define (foo target expression)
(cond [(null? expression)]
[(list? (first expression)) (foo target (first expression))]
[(eqv? (first expression) target) (cons (first (rest expression)) (foo target (rest expression)))]
[(not (eqv? (first expression) target)) (foo target (rest expression))]))
だから、私は、しかし、私が検索を続けるために、元の式に戻って取得する方法がわからない、再帰的にそのリストに関数を呼び出すしようとしています。
だから私は、私は((3 y 5 y y 8 9) 5 y 8 . #t)
を取得しています(foo 'y '(y (3 y 5 y y 8 9) (10 y 12 13 y 15 y) 17))
を呼び出すときに、それが成功した最初のリストをループしかし、それはその後停止し、表現も
における第二のリストに到達していない、私が午前1つの他の問題があります私の結果の最後にブール値を返します。これは、cond [(null? expression)]
という行のためです。式の最後にエラーが発生したため、これを追加しました。これをどのように修正できますか?
ありがとう、もう1つ、例題の1つは '(foo 'z' z)=>()'ですが、これをどのように追加できますか?現在、 'rest:contract violation expected:と(そして/ c list?(not/c空?)) given:z' –
私は '[(not?list?expr) '()]'を追加しました。 –
あなたは正しいです。これで、入力式がリストでないときは空のリストを出力します。これがあなたの最初の基本ケースとしてテストされるように、それを注文するようにしてください。 – assefamaru