2016-05-12 9 views
7

Questa domanda è correlata al codice capitolo 6 del Conrad Barski's Book, Land of Lisp.Il condizionale nella funzione lisp di Conad Barski è ridondante?

Il codice è il seguente

(defun tweak-text (lst caps lit) 
    (when lst 
    (let ((item (car lst)) 
      (rest (cdr lst))) 
     (cond ((eq item #\space) (cons item (tweak-text rest caps lit))) 
      ((member item '(#\! #\? #\.)) (cons item (tweak-text rest t lit))) 
      ((eq item #\") (tweak-text rest caps (not lit))) 
      (lit (cons item (tweak-text rest nil lit))) 
      ((or caps lit) (cons (char-upcase item) (tweak-text rest nil lit))) 
      (t (cons (char-downcase item) (tweak-text rest nil nil))))))) 

Ora guardate la parte (lit ..) e la roba di sotto di essa .. ((or caps nil) ..), quindi la mia domanda è la seguente

  • se lit è sempre vero, sarà valutato nella prima espressione dichiarata
  • se non è vero, la seconda espressione sarà sempre valutata a (or caps false) =>(or caps false) che è praticamente inutile?

Quindi la seconda espressione non dovrebbe essere semplicemente (caps (cons (char ...))?

Questo libro è stato letto da migliaia quindi devo sbagliarmi su qualcosa e io non sono John Bell.

risposta

2

Uno dei problemi è l'uso della ricorsione, che limita la lunghezza delle liste che la funzione è in grado di elaborare.

(defun tweak-text (list &aux (caps t) (lit nil)) 
    (mapcon (lambda (c) 
      (case c 
       (#\space (list c)) 
       ((#\! #\? #\.) 
       (setf caps t) 
       (list c)) 
       (#\" 
       (setf lit (not lit)) 
       ()) 
       (otherwise 
       (cond (lit (setf caps nil) (list c)) 
        (caps (setf caps nil) (list (char-upcase c))) 
        (t (setf caps nil lit nil) 
         (list (char-downcase c))))))) 
      list)) 
+0

fantastico da sapere, mi chiedo come si collega alla domanda? –

+0

@nerorevenge: la domanda attuale è stata risolta (vedere la risposta di sigjuice). Tieni presente che il codice ha più "problemi" di quelli che hai già rilevato. –

+0

capito. Vi sono altri problemi oltre alla natura ricorsiva della suddetta funzione principale? –

Problemi correlati