リストの各最上位要素から括弧を削除するコードを記述しようとしています。例えば、入力 '((1 2)(3 4))は'(1 2 3 4)を生成し、入力 '((x(y))zは'(x(y)z)を生成する。ラケットのリストからかっこを削除
カッコのペアを認識する方法はありますか?私は括弧のペアを見つけて削除することができると思っていましたが、どうやってやっているのかわからないし、先頭の要素だけを削除する方法もありません。
リストの各最上位要素から括弧を削除するコードを記述しようとしています。例えば、入力 '((1 2)(3 4))は'(1 2 3 4)を生成し、入力 '((x(y))zは'(x(y)z)を生成する。ラケットのリストからかっこを削除
カッコのペアを認識する方法はありますか?私は括弧のペアを見つけて削除することができると思っていましたが、どうやってやっているのかわからないし、先頭の要素だけを削除する方法もありません。
"私はリストの各トップレベル要素に何かしようとしています"というパターンは、map
が関与するという確かな兆候です。
'((1 2) (3 4)) => '(1 2 3 4)
だけappend*
です:また、一つの大きな手がかりはあなたの最初の例の場合です!
(append* '((1 2) (3 4))) => '(1 2 3 4)
ただし、'((x (y)) z) => '(x (y) z)
の場合は該当しません。
(append* '((x (y)) z)) => '(x (y) . z)
あなたが考えてみれば、append*
はあなたが望むものに非常に近いです:それは、リストの各要素からの括弧の1つのレベルをアンラップ。問題は、入力された要素の中にはリストではないものがあるため、展開するものは何もないということです。
シングルトンリストの各非リスト要素をラップするだけで、'((x (y)) z)
が'((x (y)) (z))
になるように修正できました。そして、我々はappend*
を使用することができます。
(append* '((x (y)) (z))) => '(x (y) z)
map
が便利来る場所です。 map
は、関数(f
)とリスト(lst
)を受け取り、lst
の各要素にf
を適用した新しいリストを返します。たとえば:
(map symbol? '(a 2 b c 5)) => '(#t #f #t #t #f)
を使用すると、1つの引数を取り、どちらかそれは、リストの場合は変更されていない、それを返すか、あるいはそうでない場合はシングルトンリストとしてそれをラップ機能を書いたとします。それをmaybe-wrap
としましょう。次に、あなたの入力を介してmaybe-wrap
をマップすることができ、その結果がappend*
に渡すことができます。
(define (remove-parens lst)
(append* (map maybe-wrap lst)))
私はmaybe-wrap
を書くためにあなたにそれを残しておきます。
残念ながら、私はラケットにとって本当に新しく、私は決してマップについては/学習したことがありません。しかし、あなたが言っていることから、私は「ある機能」を追記に置き換えることができると思われますか? – Vic
@Vic私は私の答えを更新しました。それが今何か役立つかどうか見てください。 –
append
またはmap
を使用せずに、次のように、あなたは、あなたがやりたいmutually recursive関数を定義することができます。たとえば
(define (unwrap lst)
(if (null? lst)
'()
(my-append (car lst) (cdr lst))))
(define (my-append lhs rhs)
(cond
[(null? lhs)
(unwrap rhs)]
[(pair? lhs)
(cons (car lhs)
(my-append (cdr lhs) rhs))]
[else
(cons lhs (unwrap rhs))]))
:
は> (unwrap '((1 2) (3 4 (5 (6)))))
'(1 2 3 4 (5 (6)))
> (unwrap '((x (y)) z))
'(x (y) z)
文字列、またはS-ご入力され、表現? –
入力はリストです! – Vic