2016-09-02 12 views
1

パラリストを作成するために単語のリストを結合する必要があります。私は、次の管理:ラケットでパラリストに単語リストを組み合わせる

(define (wordlist2para wl) 
    (define str " ") 
    (for ((w wl)) 
    (set! str (string-append str w " "))) 
    (string-trim str)) 

(wordlist2para '("this" "is" "a" "test")) 

出力:

"this is a test" 

それは動作しますが、それが機能していません。このための機能コードを書くにはどうすればよいですか?

答えて

3

私はそれが明示的にではなくstring-joinを使用したいと思った場合、私は3を再帰して使用しますケース:

  • 空リストが空の文字列
  • を生成する1要素のリスト(これは後続separaを有することを回避する独自の要素を生成します)
  • それ以外の場合は、cdrの再帰にスペースcarとスペースを追加します。このよう

;; racket library or srfi/13 
(string-join '("this" "is" "it")) ; ==> "this is it" 

は常に非常に簡単であること、これらを書き換える方法があります:私たちはこれを行う標準的な手順を持って

(define (wordlist2para ws) 
    (cond ((null? ws) "") 
     ((null? (cdr ws)) (car ws)) 
     (else (string-append (car ws) " " (wordlist2para (cdr ws)))))) 
+0

優れた機能的コーディング。 – rnso

2

再帰やループの必要がありません、このための基本関数string-joinは(manualを参照)があります:

(define (wordlist2para wl) 
    (string-join wl " ")) 

(wordlist2para '("this" "is" "a" "test")) 

;; -> "this is a test" 
+0

どのように簡単に!ありがとう。 – rnso

2

。私はラケットの優れた機能セットから離れて、単純なスキームと再帰的な手順に焦点を当てたいと思います。

; all things that change as arguments 
(define (wordlist2para-loop wl str) 
    (if (null? wl) 
     str 
     (wordlist2para-loop (cdr wl) 
          (string-append str (car wl) " ")))) 

今、私たちはループの置き換えのために:あなたにここから

(define (wordlist2para wl) 
    (wordlist2para-loop wl "")) 

をすることができますので、これを行うことができます、strが長くなる、あなたのループの中で、あなたが小さくなるwl 2つの物事を変えていることに注意してくださいローカルになるようにヘルパーを動かすか、おそらくそれをのようにするか、それ以外のリファクタリングを行いますが、実際の結果には影響がありません。

通知単語が1つしかないバグは修正されていません。 (wordlist2para '("this")) ; ==> "this "結果は実際にはあなたのものとまったく同じですが、尾の再帰的で機能的なものだけです。

+0

良い説明。 – rnso

1

以下の場合、私はわからないが、機能を呼び出すことができますが、いくつかの高次機能を使用しない:

(define (wordlist2para wl) 
    (string-trim 
    (apply string-append 
     (map (lambda(x) (string-append x " ")) wl)))) 

(wordlist2para '("this" "is" "a" "test")) 

出力:

"this is a test" 
関連する問題