Skip to content

Errata about do-tuples/o right? #7

@imnisen

Description

@imnisen

(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?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions