Paste number 14193: selector function

Paste number 14193: selector function
Pasted by: saccade
When:13 years, 8 months ago
Share:Tweet this! | http://paste.lisp.org/+AY9
Channel:#scheme
Paste contents:
Raw Source | XML | Display As
I wrote this to help me deal with this %$#$# multidimensional data I have.


(define (component* position-list)
  (lambda (tree)
    (let loop ((position-list position-list)
               (tree tree))
      (cond ((null? position-list)
             tree)
            ((list? (car position-list))
             (map (lambda (x)
                    (loop (cdr position-list) x))
                  (map (lambda (x)
                         (list-ref tree x))
                       (car position-list))))
            ((number? (car position-list))
             (loop (cdr position-list)
                   (list-ref tree (car position-list))))
            (else
             (map (lambda (x)
                    (loop (cdr position-list)
                          x))
                  tree))))))

(define (component . position-list)
  (component* position-list))

(define foo (outer-product '(1 2 3)
                           '(4 5 6)
                           '(7 8 9)))

;; ((((1 4 7) (1 4 8) (1 4 9))
;;   ((1 5 7) (1 5 8) (1 5 9))
;;   ((1 6 7) (1 6 8) (1 6 9)))
 
;;  (((2 4 7) (2 4 8) (2 4 9))
;;   ((2 5 7) (2 5 8) (2 5 9))
;;   ((2 6 7) (2 6 8) (2 6 9)))
 
;;  (((3 4 7) (3 4 8) (3 4 9))
;;   ((3 5 7) (3 5 8) (3 5 9))
;;   ((3 6 7) (3 6 8) (3 6 9))))


((component '(0 1)
            *
            0)
 foo)

;;  (((1 4 7) (1 5 7) (1 6 7))
;;   ((2 4 7) (2 5 7) (2 6 7)))

This paste has no annotations.

Colorize as:
Show Line Numbers

Lisppaste pastes can be made by anyone at any time. Imagine a fearsomely comprehensive disclaimer of liability. Now fear, comprehensively.