guile-user
[Top][All Lists]
Advanced

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

Re: Need help to understand a macro


From: Josef Wolf
Subject: Re: Need help to understand a macro
Date: Mon, 22 Mar 2010 20:25:56 +0100
User-agent: Mutt/1.5.20 (2009-06-14)

On Fri, Mar 19, 2010 at 08:54:02AM -0400, Ken Raeburn wrote:
> On Mar 19, 2010, at 04:57, Josef Wolf wrote:
> > My next question is more related to the defstruct macro.
> > In line 11, defstruct stores the default initializers into the vv vector:
> > 
> >   (if (pair? f) (cadr f) '(if #f #f)))
> > 
> > So if the field is a pair, the initializer is stored in vv. That's easy.
> > But if it is not a pair, '(if #f #f) is stored. What is this good for?
> > This 'if' would evaluate the 'else' part, which does not exist. So we
> > would get #f as a result. So why not storing #f in the first place? Why
> > is not
> > 
> >   (if (pair? f) (cadr f) #f))
> > 
> > used here?
> 
> The result of (if #f #f) is unspecified, not #f, according to r5rs.  That 
> means an implementation can produce whatever value it wants.
> 
> Guile has a special "unspecified" value which is distinct from #f and other 
> values, for use when a function's return value is unspecified; in some ways 
> this is probably better than picking something like #f, as it doesn't cause 
> people unfamiliar with the distinction between a language specification and a 
> language implementation to start assuming that #f (or whatever) is the value 
> that Scheme always requires in that case.  Among other things, the 
> unspecified value causes the REPL to not print a result:
> 
> guile> (if #f #f #f)
> #f
> guile> (if #f #f)
> guile>
> 
> Using (if #f #f) here is basically saying, "the initial value is 
> unspecified", instead of defaulting to #f or #t or 0 or '() or any other 
> particular normal value.

I think I like this type of "unspecified". Much better than the "undefined
behavior" definition in C.

Thanks for the explanation, Ken!




reply via email to

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