来自Udacity课程的Peter Norvig的正则表达式编译器在Racket中重写

时间:2012-05-04 12:44:50

标签: regex racket

这些天我接受了Peter Norvig的Udacity课程CS212:计算机程序设计。 不幸的是,这个课程都是用Python编写的,所以为了学习起见,我在Racket编写了等效代码,用于该课程第3单元中给出的正则表达式编译器。

您可以在此处查看我的代码:http://codepad.org/8x0rMXOi

现在,困扰我的是,Norvig先生在Python中的原始代码比我的短一些。 :(但好吧,我只是在Racket初学者,这是预期的。但我想知道是否有一些Racket专家可以缩短我的代码,以便Racket代码变得比原始Norvig的Python代码更短?

1 个答案:

答案 0 :(得分:3)

以下是一些提示。

ormap-expression in:

 (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的拼写检查(他原来的文章可能会引起你的兴趣)。这里解释了生成的拼写检查器和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