* Null (begin) blocks - V2.0.3 reports error was OK in V2.0.2
@ 2011-11-21 17:25 Ian Hulin
2011-11-21 23:02 ` Andy Wingo
0 siblings, 1 reply; 2+ messages in thread
From: Ian Hulin @ 2011-11-21 17:25 UTC (permalink / raw)
To: guile-user
Cc: Andy Wingo (Guile Developer), Ludovic Courtès,
Han-Wen Nienhuys
Hi Andy, Ludo,
LilyPond code uses (begin) as a special list terminator for some data
structures, and tests this using a custom predicate void:
(define-public (void? x) (eq? x (begin)))
This works in V1.8, and apparently used to work in 2.0.2 (no errors),
but in 2.0.3
(begin) is OK at the repl, (with readline enabled and activated), but
in any sort of procedure using it causes a diagnostic, reporting
either at the repl or in .scm files,
xxx: source expression failed to match any pattern in form (begin).
The documentation says:
6.13.1 Evaluating a series of expressions
<snip>
— syntax: begin expr1 expr2 ...
The expression(s) are evaluated in left-to-right order and the
value of the last expression is returned as the value of the
begin-expression. This expression type is used when the expressions
before the last one are evaluated for their side effects.
Guile also allows the expression (begin), a begin with no
sub-expressions. Such an expression returns the `unspecified' value.
How do we mend our code, or has Guile V2.0.3 broken?
Cheers,
Ian Hulin
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: Null (begin) blocks - V2.0.3 reports error was OK in V2.0.2
2011-11-21 17:25 Null (begin) blocks - V2.0.3 reports error was OK in V2.0.2 Ian Hulin
@ 2011-11-21 23:02 ` Andy Wingo
0 siblings, 0 replies; 2+ messages in thread
From: Andy Wingo @ 2011-11-21 23:02 UTC (permalink / raw)
To: Ian Hulin; +Cc: bug-guile, Ludovic Courtès, guile-user, Han-Wen Nienhuys
Hi Ian!
In the future, please include bug-guile@gnu.org in bug reports. It
creates a ticket so we don't forget. The system changed a bit recently,
but we hope that it works OK for you. It's certainly working better for
us.
Anyway:
On Mon 21 Nov 2011 18:25, Ian Hulin <ian@hulin.org.uk> writes:
> (define-public (void? x) (eq? x (begin)))
This is really not right, if I understand what you are checking for.
These will work:
(define-public (void? x) (unspecified? x))
(define-public (void? x) (eq? x *unspecified*))
(define-public (void? x) (eqv? x *unspecified*))
(define-public (void? x) (eq? x (if #f #f))
> This works in V1.8, and apparently used to work in 2.0.2 (no errors),
> but in 2.0.3
> (begin) is OK at the repl, (with readline enabled and activated), but
> in any sort of procedure using it causes a diagnostic, reporting
> either at the repl or in .scm files,
>
> xxx: source expression failed to match any pattern in form (begin).
Interesting. If it changed incompatibly in 2.0.x, that is a Guile bug.
Sorry about that! We'll fix it.
That said, though, you have a few misunderstandings here.
> 6.13.1 Evaluating a series of expressions
> <snip>
> — syntax: begin expr1 expr2 ...
First of all, this documentation is not quite correct. Since R5RS there
have been *two* kinds of begins: one that splices and one that
sequences.
I know that sounds complicated, but let me explain. It's not widely
known, and many Schemers consider it to be something of a bug that they
both share the same name.
Scheme has two contexts: definition context and expression context.
Like, you can only put nested definitions at the top of a function,
before the expressions, and a function has to end with an expression.
`Begin' in definition context "splices" its subforms into its containing
form. This is to allow macros to expand to multiple definitions.
In definition context, `begin' is just syntactic.
`Begin' in expression context evaluates its subforms in order. It is
used for its semantic property of sequencing effects.
It is possible for a `begin' in definition context to have no subforms.
But in expression context, you need an expression, and if there are no
expressions to evaluate, the result is a syntactic error. That is what
you are running into.
> Guile also allows the expression (begin), a begin with no
> sub-expressions. Such an expression returns the `unspecified' value.
So, I guess we have to fix this in 2.0.x. This behavior will probably
not be available in 2.2, however, so it's best to change your code now,
at the same time that we fix Guile to have the old behavior (and fix the
docs).
Finally, we are considering having expressions that produce unspecified
values actually produce 0 values. So, for example, (if #f #f) would be
the same as (values). Of course it's not something we can do in 2.0,
and we would try to publicise it well, but do keep it in mind.
Regards,
Andy
--
http://wingolog.org/
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2011-11-21 23:02 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-11-21 17:25 Null (begin) blocks - V2.0.3 reports error was OK in V2.0.2 Ian Hulin
2011-11-21 23:02 ` Andy Wingo
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).