chicken-users
[Top][All Lists]
Advanced

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

Re: [Chicken-users] multiple values in chicken


From: Kon Lovett
Subject: Re: [Chicken-users] multiple values in chicken
Date: Fri, 1 Feb 2008 10:22:13 -0800

Hi Will,

On Feb 1, 2008, at 8:46 AM, Will Farr wrote:

Isn't a call to values completely equivalent to:

(values v1 ...) => (call/cc (lambda (k) (k v1 ...)))

so

(define (values . rest) (call/cc (lambda (k) (apply k rest))))

(which seems like the point that John is making)?  Since call/cc is
free in Chicken, wouldn't this be as fast as any procedure call (well,
any procedure call which involves a procedure with a rest list)?  Why
mess with all the C_values etc?  Or is this some sort of
standards-compliance issue (I see a check for a "values continuation"
in runtime.c)?

Equivalent, yes:

#;2> (cc-values 1 2 3)
1
2
3
#;3> (values 1 2 3)
1
2
3

but ...

Using a 2 PowerPC G4 1.42 GHz, MacOS 10.4.11:

---- VALUES --------------------------------------------------
  32.571 seconds elapsed
   1.724 seconds in (major) GC
       0 mutations
    3304 minor GCs
    1103 major GCs
---- LIST ----------------------------------------------------
   8.244 seconds elapsed
   0.009 seconds in (major) GC
       0 mutations
    2457 minor GCs
       7 major GCs
---- CC-VALUES --------------------------------------------------
   42.69 seconds elapsed
   1.735 seconds in (major) GC
       0 mutations
    1824 minor GCs
    1104 major GCs

;;;; Alex Shinn's Test

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(define (car+cdr/values pair) (values (car pair) (cdr pair)))

(print "---- VALUES --------------------------------------------------")
(gc)
(time (do ((i 1 (+ i 1)))
          ((= i 10000000))
        (receive (kar kdr) (car+cdr/values '(1 . 2))
          (+ kar kdr))))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(define (car+cdr/list pair) (list (car pair) (cdr pair)))

(define-macro (bind pat expr . body)
  `(match ,expr (,pat ,@body)))

(print "---- LIST ----------------------------------------------------")
(gc)
(time (do ((i 1 (+ i 1)))
          ((= i 10000000))
        (bind (kar kdr) (car+cdr/list '(1 . 2))
          (+ kar kdr))))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(define (cc-values . vals) (call/cc (lambda (k) (apply k vals))))
(define (car+cdr/cc-values pair) (cc-values (car pair) (cdr pair)))

(print "---- CC-VALUES --------------------------------------------------")
(gc)
(time (do ((i 1 (+ i 1)))
          ((= i 10000000))
        (receive (kar kdr) (car+cdr/cc-values '(1 . 2))
          (+ kar kdr))))


Will


_______________________________________________
Chicken-users mailing list
address@hidden
http://lists.nongnu.org/mailman/listinfo/chicken-users

Best Wishes,
Kon






reply via email to

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