这些天我接受了Peter Norvig的Udacity课程CS212:计算机程序设计。 不幸的是,这个课程都是用Python编写的,所以为了学习起见,我在Racket编写了等效代码,用于该课程第3单元中给出的正则表达式编译器。
您可以在此处查看我的代码:http://codepad.org/8x0rMXOi
现在,困扰我的是,Norvig先生在Python中的原始代码比我的短一些。 :(但好吧,我只是在Racket初学者,这是预期的。但我想知道是否有一些Racket专家可以缩短我的代码,以便Racket代码变得比原始Norvig的Python代码更短?
答案 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