[Scheme-reports] multiple returns from map functions? Andy Wingo (05 May 2011 15:13 UTC)
Re: [Scheme-reports] multiple returns from map functions? Aaron W. Hsu (05 May 2011 15:31 UTC)
Re: [Scheme-reports] multiple returns from map functions? xacc.ide@gmail.com (05 May 2011 15:49 UTC)
Re: [Scheme-reports] multiple returns from map functions? Aaron W. Hsu (05 May 2011 17:40 UTC)
Re: [Scheme-reports] multiple returns from map functions? Aaron W. Hsu (05 May 2011 19:19 UTC)

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