[Top][All Lists]

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

Re: Need help to understand a macro

From: Ken Raeburn
Subject: Re: Need help to understand a macro
Date: Fri, 19 Mar 2010 08:54:02 -0400

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)
guile> (if #f #f)

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 


reply via email to

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