diff --git a/ch6-lists.lisp b/ch6-lists.lisp index df91e7f..1bf9531 100644 --- a/ch6-lists.lisp +++ b/ch6-lists.lisp @@ -2,7 +2,12 @@ (defun dwim-map (fn seq &rest seqs) "A thin wrapper over MAP that uses the type of the first SEQ for the result." - (apply 'map (type-of seq) fn seqs)) + (apply 'map (type-of seq) fn (cons seq seqs))) + +(deftest dwim-map () + (should be equal '(5 7 9) + (dwim-map '+ '(1 2 3) + '(4 5 6)))) (defun simple-mapcar-v1 (fn list) (let ((rez (list))) @@ -32,7 +37,7 @@ (defun our-cons2 (data list) (when (null list) (setf list (make-our-own-list))) (let ((new-head (make-list-cell2 - :data data + :data data :next (rtl:? list 'head)))) (when (rtl:? list 'head) (setf (rtl:? list 'head 'prev) new-head)) diff --git a/ch7-kvs.lisp b/ch7-kvs.lisp index d1946e8..d6ddce5 100644 --- a/ch7-kvs.lisp +++ b/ch7-kvs.lisp @@ -18,6 +18,21 @@ (should be equal '((:bar . :baz)) (alist-del :foo (list (cons :foo 42) (cons :bar :baz))))) +(defmethod generic-elt ((obj vector) key &rest keys) + (declare (ignore keys)) + ;; Python-like handling of negative indices as offsets from the end + (when (minusp key) (setf key (+ (length obj) key))) + (aref obj key)) + +(deftest generic-elt-vector () + (let ((vec #(1 2 3))) + (should be equal 1 (generic-elt vec 0)) + (should be equal 2 (generic-elt vec 1)) + (should be equal 3 (generic-elt vec 2)) + (should be equal (generic-elt vec 0) (generic-elt vec -3)) + (should be equal (generic-elt vec 1) (generic-elt vec -2)) + (should be equal (generic-elt vec 2) (generic-elt vec -1)))) + (defun start-memoizing (fn) (stop-memoizing fn) (setf (symbol-function fn) diff --git a/errata.md b/errata.md index 6364f30..cb83f40 100644 --- a/errata.md +++ b/errata.md @@ -1,8 +1,25 @@ # Errata for *Programming Algorithms in Lisp* -On **page xx** [Summary of error]: - -Details of error here. Highlight key pieces in **bold**. +On **page 79** Function `dwim-map` leaves the first sequence out. It should be: + +``` +(defun dwim-map (fn seq &rest seqs) + "A thin wrapper over MAP that uses the type of the first SEQ for the result." + (apply 'map (type-of seq) fn (cons seq seqs))) +``` + +*** + +On **page 109** Method `generic-elt` for vectors calculated index wrong for +negative keys. It should be: + +``` +(defmethod generic-elt ((obj vector) key &rest keys) + (declare (ignore keys)) + ;; Python-like handling of negative indices as offsets from the end + (when (minusp key) (setf key (+ (length obj) key))) + (aref obj key)) +``` *** diff --git a/progalgs.asd b/progalgs.asd index 6278094..3809e2c 100644 --- a/progalgs.asd +++ b/progalgs.asd @@ -1,11 +1,11 @@ (in-package #:asdf-user) (defsystem #:progalgs - :version "1.1" + :version "1.2" :description "Code for the book 'Programming Algorithms in Lisp'" :author "Vsevolod Dyomkin " :maintainer "Vsevolod Dyomkin " - :depends-on (#:rutils #:eager-future2 #:sha1 #:lparallel #:should-test) + :depends-on (#:rutils #:eager-future2 #:sha1 #:lparallel #:should-test #:flexi-streams) :serial t :components ((:file "package") (:file "ch1-complexity")