chicken-users
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Chicken-users] complex library package issue


From: Terrence Brannon
Subject: [Chicken-users] complex library package issue
Date: Sat, 1 Sep 2007 17:49:03 -0400

Hello, the complex package is turning the addition of two lists which
start with zero into a complex result when it should just be another
list. Case synopsis:

(Plus '(0 1 2 3) '(0 1 2 3))  ;; yields a complex!
(Plus '(1 2 3) '(1 2 3))      ;; yields a list, as expected
(Plus  3 '(1 2 3))            ;; yields a list, as expected
(Plus  3 4)                   ;; yields a scalar, as expected

The code which follows will exemplify this behavior, as long as you
get all the eggs that it requires:

chicken-setup array-lib complex

(require-extension array-lib)
(require-extension array-lib-hof)
(require-extension complex)


(use srfi-1)

; http://srfi.schemers.org/srfi-63/srfi-63.html
(define (strict-array? obj)
  (and (array? obj) (not (string? obj)) (not (vector? obj))))


(define (map-wrap proc . lists)
  (cond
   ((any strict-array? lists)
    (let* ([newlists (apply array-agree lists)])
      (apply array-map '#() proc newlists)))
    ((any (lambda (x) (and list? (not (complex? x)))) lists)
         (apply map
             proc
             (map (lambda (x)
                    (if (not (pair? x))
                        (circular-list x)
                        x))
                  lists)))
    (else (apply proc lists))))

(define (Shape dim-list . data)
  (let* ([dimension-list (if (list? dim-list) dim-list (list dim-list))]
         [prototype '#()]
         [dimensions (apply make-array-dimensions dimension-list)]
         [cardinality (apply * dimension-list)]
         [data-size (lambda () (length data))]
         [list-logic (lambda (L)
                       (cond
                        ((= (data-size) cardinality) data)
                        ((> (data-size) cardinality) (take data cardinality))
                        ((< (data-size) cardinality)
                         (take (apply circular-list data) cardinality))))]
         [data* (if (list? data)
                    (list-logic data)
                    (make-list cardinality data))]
         [vektor (list->vector data*)])
    (apply vector->array vektor prototype dimension-list)))


(define (Plus m n) (map-wrap + m n))

(Plus '(0 1 2 3) '(0 1 2 3))  ;; yields a complex!
(Plus '(1 2 3) '(1 2 3))      ;; yields a list, as expected
(Plus  3 '(1 2 3))            ;; yields a list, as expected
(Plus  3 4)                   ;; yields a scalar, as expected




reply via email to

[Prev in Thread] Current Thread [Next in Thread]