Re: [Scheme-reports] multiple returns from map functions?
Aaron W. Hsu 05 May 2011 19:18 UTC
On Thu, 05 May 2011 14:48:40 -0400, Andy Wingo <wingo@pobox.com> wrote:
> On Thu 05 May 2011 19:39, "Aaron W. Hsu" <arcfide@sacrideo.us> writes:
>
>> On Thu, 05 May 2011 11:43:53 -0400, <xacc.ide@gmail.com> wrote:
>>
>>> The brings up the question whether list control procedures can accept
>>> cyclic
>>> lists.
>>
>>> Should the following be valid?
>>
>> This is interesting, normally, `map' is specifically not allowed to take
>> circular lists and you get an error when trying to deal with them.
>> However, that is partly because of the restriction prior to this that
>> all
>> arguments should be of the same length. Now, I think, there is an
>> opportunity to consider `map' in different terms. Whether we should do
>> this or not is still up to question.
>
> I don't know either, but do see srfi-1.
Here's a naive one argument map form that actually does handle circular
lists. It's probably not very clean, but it works.
> (define (map f lst)
(let ([circular #f])
(define (loop t r)
(cond
[(null? t) '()]
[(null? r)
(cons (f (car t))
(loop (cdr t) r))]
[(null? (cdr r))
(cons (f (car t))
(loop (cdr t) '()))]
[(eq? t r)
(let ([res (list (f (car t)) (f (cadr t)))])
(set! circular (cdr res))
res)]
[else (cons (f (car t)) (loop (cdr t) (cddr r)))]))
(cond
[(null? lst) '()]
[(null? (cdr lst)) (list (f (car lst)))]
[else
(let ([res (loop lst (cddr lst))])
(when circular (set-cdr! circular res))
res)])))
> (let ([x (iota 10)])
(set-cdr! (list-tail x 9) x)
(map (lambda (x) (1+ x)) x))
Warning in pretty-print: cycle detected; proceeding with (print-graph #t)
#0=(1 2 3 4 5 6 7 8 9 10 . #0#)
>
Aaron W. Hsu
--
Programming is just another word for the lost art of thinking.
_______________________________________________
Scheme-reports mailing list
Scheme-reports@scheme-reports.org
http://lists.scheme-reports.org/cgi-bin/mailman/listinfo/scheme-reports