LINKÖPINGS UNIVERSITET
Institutionen för datavetenskap		2000-08-17
Anders Haraldsson

Rättelser till läroboken Haraldsson, Programmering i Lisp, första tryckningen 1993

Fellistan är uppdelad i väsentliga fel och smärre fel (typ: i stort sätt självklara parentesfel mm). Gör ändringar i boken för alla väsentliga fel. Hittar ni nya så meddela mig. Jag för in på denna lista de nya felen ni rapporterar till mig.

Väsentliga rättelser:

sid rad 8 +18 värdet skall var 52, ej storlek 9 +5 och +7 symbolen billistan ersätts med bilar 15 -5 Hela meningen skall vara "Hela uttrycket kan ej vara ett korrekt uttryck eftersom deluttrycket (prim-uttryck prim-uttryck) ej är korrekt." 24 -6 värdet skall vara 62.831.. 24 -4 värdet skall vara 314.15.. 40 +16 står r/00, skall vara r/100 45 +18 står "Funktionen sqrt", skall var "Funktionen my-sqrt" 54 +22 står (list 1 2 3), skall var (list 3 2 1) 76 4 värdet skall vara 150 76 -3 står (> n 0), skall var (>= n 0) 89 +16 (1+ (elements-res (first l)) res)))) ) skall ersättas med (elements-res (first l) res))) ))) 107 +1 skall vara (värde '(2 + 3)) 107 +3 skall vara (värde '((4 * (3 - 1)) + (5 / 3))) 119 +16 uttrycket #'function skall vara #'funktion 120 -10 står (list + const 'n), skall vara (list '+ const 'n) 136 -17, -15, -12 och -10 symbolen string> skall ersättas med string< 136 -4 quote-tecken saknas, skall vara #'(lambda (x y) 188 +16 symbolen v (2 ställen) skall bytas mot symbolen n 194 -7 högerparentes felplacerad, skall vara ... (make-array 6 :initial-element 'nil)) 196 -4 avslutande högerparentes saknas 203 -9 och -11 det står #S(name, skall vara #S(person name 229 +3 Funktionen perm skall definieras: (defun perm (l) ; ... (let ((res (list '()))) <- denna rad skall in (dolist (e l res) (let ((new-perms '())) (dolist (perm .. ; ... (setq new-perms (append ... (setq res new-perms)) ))) <- denna rad indenteras 229 +16 symbolen nr-of-elements byts mot symbolen len 282 +3 Andra sambandet utgår. Felet är att om vi bildar ett uttryck så måste argumenten i argumentlistan quote'as. Man skulle kunna skriva (apply #'fn args) = = (eval (cons 'fn (mapcar #'(lambda (arg) (list quote arg)) args))) 312 -12 exemplet skall vara (setq p '(b a (b a) a b)) 314 +14 uttrycket skall vara (setq p '(a (b a) (a) b)) 321 +11 uttrycket (rest circ) skall vara (last circ) 322 -6 ändra slutet av uttrycket till `(prog1 (first ,var) (setf ,var (rest ,var)))) 323 -6 står "som map", skall vara "som maplist" 389 +7 står (* -10 (+ 20 30) 40) skall var (* -20 (+ 20 30) 40) 390 +15 10000 byts ut mot 100 391 -7 Om månaden är januari skall inte skottår räknas. Därför bör vi ersätta sista raden i funktionen med (if (and (skottår? år) (>= månader 2)) 1 0) 443 -8 raden skall börja med backquote, skall vara `',(bq-fn expr))) 444 +1 till +5 Ersätt definitionen av repeat med (defmacro repeat (&rest args) (let ((predicate (first (last args))) (loop-body (butlast args))) `(loop ,@loop-body (if ,predicate (return 'nil))))) 448 -8 svaret skall vara (x (b y z) (z)), dvs sista elementet skall omslutas ett parentespar 471 +6 sidhänvisning fel, &rest 26 skall vara &rest 266 471 +9 står *print-circl*, skall vara *print-circle*

Smärre fel: 8 -6 skall stå "hälften av tio" 34 -2 står "kapitel 20", skall var "kapitel 21" 38 10 formeln skall var "kapital(k+k·r/100,n-1,r)" 42 -11 står (sum2), skall var (sum 2) 75 7 avslutande högerparentes saknas, skall vara (fak-iter n 1))) 82 -6 står (+ 1 (+ 2)) skall stå (+ 1 (+ 1 2)) 89 -12 saknas en högerparentes, skall sluta x d)) 89 -5 den sista högerparentesen skall bort, skall sluta (rest l)) 100 -8 och -6 ersätt funktionen find med my-find. Funktionen find finns redan i Lisp 103 +7 saknas en högerparentes, skall sluta maxsum sum))) 106 -11 saknas två högerparenteser, skall sluta operator")))) 107 +4 värdet skrivs ut som ett rationellt tal, dvs 29/3 109 +1 står weightp, skall vara weight 110 -14 en högerparentes för mycket, skall var '()) 110 -5 en högerparentes för mycket, skall sluta right-path) 110 -3 raden skall indenteras ett steg år vänster, samt en högerparentes för mycket, skall vara '()))) ))) 111 -16 bättre med parameternamnen path istf bt 111 -14 bättre med parameternamnet path istf p 117 -1 värdet skall vara 355 118 -3 värdet skall vara 355 120 -18 Meningen skall vara "Problemet med fria variabler beaktar vi inte här, utan hänvisar till kapitel 19". 126 -8 avslutande högerparentes saknas, skall vara e)) 126 -7 en högerparentes för mycket, skall vara list)) ) 128 +9 saknas en högerparentes, skall sluta (cons 'a l)) 129 -3 en högerparentes saknas, skall sluta 'symbol)) 139 -10 funktionen insert-all-position skall vara insert-all-positions 141 -9 (figurerna) Det står UT skall var OUT 156 +10 står lisp, skall vara listp 159 -1 och -3 en högerparentes för mycket, skall vara uttr)) 160 +2, +4, +7, +9, +11, +14, +16 och -6 en högerparentes för mycket, skall vara uttr)) 161 +10 quote-tecken saknas, skall vara (skapa-variabel 'x) 163 -3 det står 0*4+4*1+0, skall vara 0*x+4*1+0 171 +9 det står '((+ . (lambda, det skall stå '((* . (lambda 171 +17 det står (* . (lambda, det skall stå (+ . (lambda 175 +12 det står + 2 tim 45 min, skall vara + 2 tim 30 min 182 -1 Anders-årsalmanacka93))) skall indenteras att börja under (skapa-månad 183 -3 en högerparentes för mycket i slutet 196 -4 avslutande högerparentes saknas 204 +3 står fe'male, skall vara female 205 -13 raden skall indenters så att den börjar under (bil två rader upp 205 -13 sista högerparentesen skall bort, raden slutar vikt) 205 -12 till -7 Skall indenteras ett steg ut 207 +3 ssista högerparentesen skall bort, raden slutar vikt) 210 +12 avslutande högerparentes saknas, skall vara ... skapa-månad m))) 217 +9 funktionen +1 skall vara 1+ 229 -4 blank saknas i permnr-of-elements, skall vara perm nr-of-elements 231 +9 står fil34, skall vara fil. 234 +2 står read-txo-lines, skall vara read-two-lines 256 +3 står 100, skall vara 10 261 +12 står avsnitt 14.3.8, skall vara avsnitt 14.3.7 288 +14 symbolen glob-var byts ut mot symbolen global-var 329 -1 saknas slut på sträng, skall vara ... reset to nil") ... 330 -9 samma som ovan 331 -13 samma som ovan 350 +7 blankt tecken saknas, skall börja (prog1 value ... 353 -4 står (funcall mitt-konto 'ta-ut 300) skall vara (funcall mitt-konto 'ut 300) 354 +1 står (funcall mitt-konto 'räkna-ränta) skall vara (funcall mitt-konto 'ränta) 380 +12 Lisp-sanningsvärde skall bytas ut mot uttryck 390 +14 sista högerparentesen skall bort, raden slutar 100))) 392 +6 saknas avslutande högerparentes, skall sluta ... (månad d) 1)) 403 +8 står lita, skall vara lista 407 -2 saknas högerparentes, skall vara ... (first l))) (depth* ... 426 +8 det står "initialiseras till 0", skall vara "initialiseras till 1" 444 +12 skall vara backquote, raden börjar (t `(let ((value ... 454 +17 avslutande 9 skall vara en högerparentes, dvs slutar med (cdr bt))) )) 457 +5 står #'(lambda meddelande .., skall vara #'(lambda (meddelande ..