Lisp代码解释

Posted

技术标签:

【中文标题】Lisp代码解释【英文标题】:Lisp code explanation 【发布时间】:2009-11-19 20:16:26 【问题描述】:

我正在从 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)))

当然,我可以跳过它并实现 cmets 所说的内容,但只是想确保后台没有发生任何魔法。那么......这个函数是如何工作的——它实际上在哪里读取字符?它是否像我想的那样丑陋,并且在最后一次检查end-of-sentence? 时会消耗字符作为副作用吗?或者char-ready? 真的读到了什么?

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

【问题讨论】:

【参考方案1】:

我不是方案程序员,但似乎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))

【讨论】:

【参考方案2】:

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

这些函数中的一些函数不是标准的 mit-sheme,例如 char-exist-last?initial?。(1) 所以我不能确定它们是做什么的。

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

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

对于同一来源char-ready? 的工作方式如下:“如果字符在输入端口上准备好,则返回 #t,否则返回 #f。”

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

(1)MIT-Scheme Reference

【讨论】:

以上是关于Lisp代码解释的主要内容,如果未能解决你的问题,请参考以下文章

Lisp 简单问题

写一个简单的lisp解释器

类Lisp解释器JavaScript实现

[编译原理]用BDD方式开发lisp解释器(编译器)|开发语言java|Groovy|Spock

什么是“编写其他程序的Lisp程序”?

安装Emacs并设置racket环境