[Top][All Lists]
[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
- Re: [Chicken-users] multiple values in chicken, (continued)
Re: [Chicken-users] multiple values in chicken, Zbigniew, 2008/02/01
Re: [Chicken-users] multiple values in chicken, F. Wittenberger, 2008/02/01
Re: [Chicken-users] multiple values in chicken, John Cowan, 2008/02/01
Re: [Chicken-users] multiple values in chicken, felix winkelmann, 2008/02/04
Re: [Chicken-users] multiple values in chicken, John Cowan, 2008/02/04
Re: [Chicken-users] multiple values in chicken, felix winkelmann, 2008/02/04
Re: [Chicken-users] multiple values in chicken, John Cowan, 2008/02/04
Re: [Chicken-users] multiple values in chicken, Graham Fawcett, 2008/02/04