Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Errata about do-tuples/o right? #7

Open
imnisen opened this issue Nov 28, 2018 · 1 comment
Open

Errata about do-tuples/o right? #7

imnisen opened this issue Nov 28, 2018 · 1 comment

Comments

@imnisen
Copy link

imnisen commented Nov 28, 2018

(defmacro do-tuples/o (parms source &body body)

As macro do-tuples/o describe in chapter 11, define like bellow:

;; problem reported to pg but not checked -- test this!!!!!!!!!!
;; http://www.paulgraham.com/onlisperrata.html:
;; p. 156. In do-tuples/o the expression (1- (length parms)) should be
;; (- (length source) (length parms)).
;; Reported by Roland. (at netquant.com.br)
(defmacro do-tuples/o (parms source &body body)
  (if parms
      (let ((src (gensym)))
        `(prog ((,src ,source))
            (mapc (lambda ,parms ,@body)
                  ,@(map0-n (lambda (n)
                              `(nthcdr ,n ,src))
                            ;;(1- (length parms)) ;; error in text
                            (- (length source) (length parms)) ;; corrected

                            ))))))

should works like following:

CL-USER> (do-tuples/o (x y) '(a b c)
           (princ (list x y)))
(A B)(B C)
NIL

However, in expression (- (length source) (length parms)) ,
(length source) will always eval to 2 (because of quote expression ),

What's worse, the number of list value return by

,@(map0-n (lambda (n)
            `(nthcdr ,n ,src))
          (- (length source) (length parms))

is not equal to number of parms(which is required by operator mapc)

I foud the origin (1- (length parms)) is right. May I miss somthing?

@michael-776
Copy link

I agree. The "correction" listed in the errata is wrong, the original text is right.

The result of evaluating map0-n here is a list of lists, the length of which has to match the arity of the lambda passed to mapc. (1- (length parms)) is the right argument for that.

The erroneous correction results in a "called with invalid number of arguments" error.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants