Lisp代码解释

Lisp代码解释,lisp,scheme,Lisp,Scheme,我正在从lisp移植一些代码,但我在这一部分遇到了麻烦(显然这是针对mit方案的) 当然,我可以跳过这一步,实现评论中所说的功能,但我只是想确保背景中没有魔法发生。所以这个函数是如何工作的——它实际上在哪里读取字符?它是否像我想象的那样难看?它是否会在最后一次签入句末时将字符作为副作用使用??或者字符准备好了吗?实际上读到了什么 但是,再说一遍,(句末?)(c-g-iter(+num 1))是什么意思,因为我不希望c-g-iter返回一个字。我不是方案程序员,但似乎在读取字符时正在使用字符 句末

我正在从lisp移植一些代码,但我在这一部分遇到了麻烦(显然这是针对mit方案的)

当然,我可以跳过这一步,实现评论中所说的功能,但我只是想确保背景中没有魔法发生。所以这个函数是如何工作的——它实际上在哪里读取字符?它是否像我想象的那样难看?它是否会在最后一次签入
句末时将字符作为副作用使用?
?或者
字符准备好了吗?
实际上读到了什么


但是,再说一遍,
(句末?)(c-g-iter(+num 1))
是什么意思,因为我不希望
c-g-iter
返回一个字。

我不是方案程序员,但似乎在
读取字符时正在使用字符

句末?
另一方面,似乎在没有参数的情况下被调用,即使它被声明为使用一个参数。我假设它依次调用的函数能够容忍系统为未指定参数提供的任何内容(
nil
?)


成对的
(句末?)(c-g-iter(+num 1))
cond
的一个参数,您可以将其视为开关或简明if/else;第一部分是一个测试
(句末?
),第二部分是如果是真的
(c-g-iter(+num 1))

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

这些函数中的某些函数不是标准的mit sheme,例如
char exist last?
initial?
(1),因此我无法确定它们的作用

话虽如此,我认为
句末?
接受一个字符串(
word
,所以它应该是一个单词),如果它的最后一个字符是“!”,则返回true?或“.”,单词后的下一个字符是空格、换行符或制表符。另外,看看
initial
,它可能不能是句子中的第一个单词(“A.”不应该返回true,但“A dog.”应该返回true。)

read char
确实“使用字符”-“返回输入端口中可用的下一个字符,更新输入端口以指向以下字符。”(谷歌搜索“read char mit scheme”获取。)

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

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

(一)

(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)))