Lisp代码解释

时间:2009-11-19 20:16:27

标签: lisp scheme

我正在从lisp中移植一些代码,但是我被困在这一部分(显然是针对mit-scheme)

(define (end-of-sentence? word)
  (and (or (char-exist-last? word '#\.)
           (char-exist-last? word '#\!)
           (char-exist-last? word '#\?))
       (not (initial? word))
       (or (eq? (peek-char) '#\Space) ;;peek- so test for linefeed isn't affected
           (eq? (peek-char) '#\n) ;;note- test for space isn't neccessary
           (eq? (read-char) '#\t))))


;;counts the number of sentences in a given file and
;;stops at the given number
;;returns true once at that position, returns error if eof
(define (goto-sentence? file stop)
  (define (c-g-iter num)
    (cond ((= num stop)
           #t)
          ((end-of-sentence?)
           (c-g-iter (+ num 1)))
          ((not (char-ready?))
           (error "EOF reached, number to large in goto-sentence?: " stop))
          (else
           (c-g-iter num))))
  (begin
    (open-path file)
    (c-g-iter 1)))

当然,我可以跳过它并实现评论所说的内容,但只是想确保背景中没有任何神奇的事情发生。那么......这个功能如何工作 - 它实际上在哪里阅读角色?它是否像我想的那样丑陋,并且它在end-of-sentence?的最后一次检查中消耗了角色作为副作用?或者char-ready?实际上是否读过了什么?

但话又说回来 - (end-of-sentence?) (c-g-iter (+ num 1))意味着什么,因为我不希望c-g-iter返回一个字。

2 个答案:

答案 0 :(得分:2)

我不是计划程序员,但似乎在read-char source

中消费了字符 另一方面,

end-of-sentence?似乎在没有参数的情况下被调用,即使它被声明为一个参数。我假设它调用的函数反过来容忍系统为未指定的参数提供的任何内容(nil?)

(end-of-sentence?) (c-g-iter (+ num 1))对是cond的参数,您可以像开关一样思考,或者简洁if / else;第一部分是测试(end-of-sentence?),第二部分是真实的(c-g-iter (+ num 1))

答案 1 :(得分:1)

只是把我的声音添加到合唱中;也许我可以提供一些见解。

这些功能中的某些功能不是标准的功能,例如char-exist-last?initial?。(1)因此我无法确定它们的作用。

话虽如此,我认为end-of-sentence?接受一个字符串(word,所以它应该是一个单词)并且如果它的最后一个字符是'!',则返回true,'?或'。',单词后面的下一个字符是空格,换行符或制表符。另外,看intial,它可能不是句子中的第一个单词('A',例如,不应该返回true,但'A dog。'应该。)

read-char确实'消耗字符' - “返回输入端口可用的下一个字符,更新输入端口以指向下一个字符。” (用Google搜索'read-char mit scheme'获取MIT-Scheme input procedures。)

根据相同的源char-ready?的工作原理如下:“如果字符在输入端口上就绪,则返回#t,否则返回#f。”

希望这至少是有启发性的人!

(1)MIT-Scheme Reference