1

最近、Peter Norvig の Udacity コース CS212: DESIGN OF COMPUTER PROGRAMS を受講しました。残念ながら、このコースはすべて Python で行われるため、学習のために、そのコースのユニット 3 で与えられた正規表現コンパイラ用の同等のコードを Racket で作成しました。

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

さて、私が気になっているのは、Norvig 氏の Python での元のコードが私のコードよりもいくらか短いことです。:( でも、私は Racket の初心者で、それは当然のことです。しかし、Racket の専門家が私のコードを短くして、Racket のコードが元の Norvig の Python コードよりも短くなるようにできるのではないでしょうか?

4

1 に答える 1

3

ここにいくつかのヒントがあります。

次の ormap 式:

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

次のように書くことができます

   (memv c (string->list chars)) 

の if 式

(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 のスペル チェックを実装しました (彼の元の記事に興味があるかもしれません)。結果のスペル チェックと concat マクロについては、こちらで説明しています。

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

于 2012-05-04T13:38:25.900 に答える