[plt-scheme] minor WHEN and UNLESS question

From: Yavuz Arkun (yarkun at gmail.com)
Date: Sun Jul 6 04:32:18 EDT 2008

When you say "no expr is in tail position" and "destroy" do you mean
that it won't be tail call optimized? Because the infinite loop:

(let loop ()
  (unless #f (loop))

seem to run happily forever without apparent GC, just like

(let loop ()
  (loop))

BTW, the looping idioms in schematics:cookbook is exactly where I
stumbled unto this issue:
http://schemecookbook.org/Cookbook/IdiomLoopingConstructs

Are you suggesting that they are  inappropriate in PLT Scheme?

--Yavuz

On Sun, Jul 6, 2008 at 04:47, Eli Barzilay <eli at barzilay.org> wrote:
> Looks to me like something that perhaps was planned?
>
> I think that the main point of the documentation should be that *you*
> shouldn't use the result of `when'/`unless', because it might be void
> (not #f, btw).  If the forms need to always return void, then the
> implementation will not have the subform in a tail-position, which
> will destroy things like
>
>  (let loop ()
>    ...
>    (unless blah (loop)))
>
> but the description says just that ("No expr is in tail position with
> respect to the when form").
>
>
> On Jul  5, Matthias Felleisen wrote:
>>
>> Like all Scheme conditionals, when/unless return the value of their
>> sub-expressions if the condition is true. Otherwise, they produce
>> false. The docs are wrong.
>>
>> Thanks for reporting the problem. For future discoveries of
>> mistakes, please use Help Desk to report them. -- Matthias
>>
>>
>>
>> On Jul 5, 2008, at 4:19 PM, Yavuz Arkun wrote:
>>
>> > This is a rather minor issue I noticed in the documentation:
>> >
>> > According to http://docs.plt-scheme.org/reference/when_unless.html,
>> > the results of evaluating WHEN and UNLESS are ignored. According to
>> > http://docs.plt-scheme.org/reference/when_unless.html, the result is
>> > #<void> (which is of course ignored by the REPL). Evaluating the
>> > following expression in module language
>> > shows that actually the result of the last expression in the body is
>> > available at least in some cases; didn't test extensively.
>> >
>> >> (+ 1 (when #t (+ 1 2) (+ 3 4)))
>> > 8
>> >
>> >> (+ 1 (unless #f (+ 1 2) (+ 3 4)))
>> > 8
>> >
>> > So the question is...which version is the correct one? Ignored,
>> > #<void>, value of the last expression in the body?
>> > --Yavuz
>> > _________________________________________________
>> >   For list-related administrative tasks:
>> >   http://list.cs.brown.edu/mailman/listinfo/plt-scheme
>>
>> _________________________________________________
>>   For list-related administrative tasks:
>>   http://list.cs.brown.edu/mailman/listinfo/plt-scheme
>
> --
>          ((lambda (x) (x x)) (lambda (x) (x x)))          Eli Barzilay:
>                  http://www.barzilay.org/                 Maze is Life!
>


Posted on the users mailing list.