2009-11-19 68 views
2

我移植從LISP一些代碼,但我被困在這部分(顯然這是麻省理工學院的方案)Lisp代碼的解釋

(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

我沒有計劃程序員,但現在看來,字符被消耗在read-charsource

end-of-sentence?,另一方面似乎越來越沒有所謂的參數,即使它被聲明爲一個。我認爲它依次調用函數容忍任何系統提供未指定的參數

兩人(end-of-sentence?) (c-g-iter (+ num 1))是一個參數cond,你能想到像一個開關或簡潔的if/else(nil?);第一部分是測試(end-of-sentence?),第二部分是要執行的內容如果爲真(c-g-iter (+ num 1))

1

只需將我的聲音添加到合唱中;也許我可以提供一些見解。 (1)所以我不能確定它們是做什麼的。所以我不確定它們是做什麼的。

這就是說,我認爲end-of-sentence?需要一個字符串(word,所以它應該是一個單詞),並返回true,如果它的最後一個字符是'!','?或'。',並且該單詞之後的下一個字符是空格,換行符或製表符。另外,看着intial,它可能不是句子中的第一個單詞(例如,'A',例如,不應該返回true,而應該是'A dog'。)

read-char確實'消耗字符' - 「返回從輸入端口可用的下一個字符,更新輸入端口以指向以下字符。」 (Google搜索「讀取字符方案」得到MIT-Scheme input procedures。)

每個相同的源代碼char-ready?的工作方式如下:「返回#t,如果輸入端口上的字符已準備就緒,否則返回#f。

希望這是至少有人啓迪!

(1)MIT-Scheme Reference