2009-11-19 8 views
2

Je portage du code de Lisp, mais je suis resté bloqué dans cette partie (apparemment, c'est pour mit-scheme)explication du code 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))) 

Bien sûr, je pourrais simplement ignorer cela et mettre en œuvre ce que disent les commentaires c'est le cas, mais je voulais juste être sûr qu'il n'y a pas de magie en arrière-plan. Alors ... comment cette fonction fonctionne-t-elle? Où lit-elle réellement les personnages? Est-il aussi moche que je pense et consomme-t-il les caractères comme un effet secondaire dans le dernier contrôle end-of-sentence?? Ou le char-ready? lit-il quelque chose?

Mais encore une fois - que signifie (end-of-sentence?) (c-g-iter (+ num 1)), car je ne m'attends pas c-g-iter à retourner un mot.

Répondre

2

Je ne suis pas programmeur système, mais il semble que les caractères sont consommés dans read-charsource

end-of-sentence? d'autre part semble être obtenir appelé sans paramètre, même si elle est déclarée en prendre un. Je suppose que les fonctions qu'elle appelle à son tour, sont tolérants à ce que le système fournit des paramètres non spécifiés

La paire (end-of-sentence?) (c-g-iter (+ num 1)) est un paramètre à cond, que vous pouvez penser comme un commutateur ou concise if/else (nil?); la première partie est un test (end-of-sentence?), et la seconde est ce qu'il faut exécuter si vrai (c-g-iter (+ num 1))

1

Juste ajouter ma voix au refrain; peut-être que je peux donner un aperçu.

Certaines fonctions qui sont dans ces fonctions ne sont pas standard mit-sheme, tels que char-exist-last? et initial? (1) Donc, je ne peux pas être sûr de ce qu'ils font. Cela étant dit, je pense que end-of-sentence? prend une chaîne de caractères (word, donc ce devrait être un mot) et renvoie true si son dernier caractère est un '!', '? ou '.', et le caractère suivant après le mot est un espace, une nouvelle ligne ou un caractère de tabulation. De plus, en regardant intial, il ne peut probablement pas être le premier mot dans la phrase (« A. », par exemple, ne devrait pas retourner vrai, mais « un chien. » Devrait.)

read-char en effet ne ' consume les caractères '- "Renvoie le caractère suivant disponible à partir du port d'entrée, mettant à jour le port d'entrée pour pointer sur le caractère suivant." (Googlé « schéma mit lecture char » pour obtenir MIT-Scheme input procedures.)

Par la même source char-ready? fonctionne comme ceci: « Retours #t si un personnage est prêt sur l'entrée ports et retourne #f autrement. »

Espérons que ce soit au moins quelqu'un d'éclairant!

(1) MIT-Scheme Reference