2012-05-04 5 views
1

最近、私はPeter NorvigのUdacityコースCS212:コンピュータプログラムの設計を取りました。 残念ながら、コースはすべてPythonで行われていますので、学習のために、私はそのコースのユニット3で与えられた正規表現コンパイラのためにRacketに同等のコードを書きました。Peter Norvigの正規表現コンパイラUdacityコースからRapeetで書き直し

あなたがここに私のコードを見ることができます:http://codepad.org/8x0rMXOi

今、私を悩ませているものは、Pythonで氏Norvigの元のコードは私よりもやや短いことです。私はラケットの初心者ですが、ラケットの専門家が自分のコードを短くすることができるので、ラケットコードがオリジナルのノービッグのPythonコードよりも短くなるのではないかと思っていますか?

+1

この質問はこの質問がCode Reviewのためのより良いフィットするだろうコードレビュー –

+0

に適しているようですか? –

答えて

3

ヒントで

ormap表現:。

(define (in-chars? c chars) 
    (ormap (lambda (ch) (equal? c ch)) (string->list chars))) 

(memv c (string->list chars)) 

ザ・IF-epressionのように記述することができますあなたの関数が小さく、ポイントにしているので、私はあまり変化しないが

(define (match pattern text) 
    (define remainders (pattern text)) 
    (if (not (set-empty? remainders)) 
     (substring text 0 (- (string-length text) 
          (string-length (argmin string-length 
                (set->list remainders))))) 
     #f)) 

(and (not (set-empty? remainders)) 
     (substring ...) 

のように記述することができます。

文字列を操作するためのより便利な構文を使用すると、 文字列操作プログラムの読み書きが簡単になります。数年前、私は試みを行い、concatマクロを書きました。

私はそれを使ってNorvigのスペルチェッカーを実装しました(彼のオリジナルの記事はあなたに興味のあるかもしれません)。結果のスペルチェックと、連結マクロがここ

http://blog.scheme.dk/2007/04/writing-spelling-corrector-in-plt.html

アップデートを説明している:私はスペルチェッカーの更新バージョンを書かれています。 concatマクロは簡単な文字列操作を短縮します。

https://github.com/soegaard/this-and-that/blob/master/spell-checker.rkt

+0

'in-chars? 'の別のアプローチ:' for/or'を使用してください。文字列は繰り返し可能です。 '(/または([ch chars])(equal?c ch))'になります。 – dyoo