2017-04-11 6 views
1

リストの各最上位要素から括弧を削除するコードを記述しようとしています。例えば、入力 '((1 2)(3 4))は'(1 2 3 4)を生成し、入力 '((x(y))zは'(x(y)z)を生成する。ラケットのリストからかっこを削除

カッコのペアを認識する方法はありますか?私は括弧のペアを見つけて削除することができると思っていましたが、どうやってやっているのかわからないし、先頭の要素だけを削除する方法もありません。

+0

文字列、またはS-ご入力され、表現? –

+0

入力はリストです! – Vic

答えて

0

"私はリストの各トップレベル要素に何かしようとしています"というパターンは、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を書くためにあなたにそれを残しておきます。

+0

残念ながら、私はラケットにとって本当に新しく、私は決してマップについては/学習したことがありません。しかし、あなたが言っていることから、私は「ある機能」を追記に置き換えることができると思われますか? – Vic

+0

@Vic私は私の答えを更新しました。それが今何か役立つかどうか見てください。 –

0

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) 
関連する問題