Sujet : re: matrix operations
De : No_spamming (at) *nospam* noWhere_7073.org (B. Pym)
Groupes : comp.lang.lispDate : 03. Jul 2024, 03:32:54
Autres entêtes
Organisation : A noiseless patient Spider
Message-ID : <v629o5$1sdhf$1@dont-email.me>
User-Agent : XanaNews/1.18.1.6
Barry Margolin wrote:
Zachary Turner <ztur...@bindview.com> wrote:
I've got a 3x3 matrix, stored as ((r1c1 r1c2 r1c3) (r2c1 r2c2 r2c3) (r3c1
r3c2 r3c3)). I want to check if any of the columns have the same three
elements. It's easy for rows, I can just use
(or
(every #'equal (car matrix))
(every #'equal (cadr matrix))
(every #'equal (caddr matrix)))
Actually, that doesn't work. EVERY passes a single element to the test
function, but EQUAL requires two arguments. What you need is:
(or (every #'(lambda (x) (equal x (caar matrix)))
(cdar matrix))
(every #'(lambda (x) (equal x (caadr matrix)))
(cdadr matrix))
(every #'(lambda (x) (equal x (caaddr matrix)))
(cdaddr matrix)))
That's hideous.
My questions are:
a) Can I do this more elegantly using a mapxxx function?
(defun (all-elements-equal (list)
(destructuring-bind (head . tail) list
(every #'(lambda (x) (equal x head))
tail))))
"#'(lambda" shows that he doesn't understand
the lambda macro.
Scheme (Gauche or Racket)
;; Racket needs this:
(require srfi/1) ;; every
(define (all-elements-equal lst)
(or (null? lst)
(every equal? lst (cdr lst))))