[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Chicken-users] Problem with amb - or nice bug?
From: |
Tobia Conforto |
Subject: |
Re: [Chicken-users] Problem with amb - or nice bug? |
Date: |
Sat, 1 Nov 2008 03:39:44 +0100 |
Hello,
I am learning scheme and am trying to implement the "amb" operator.
Hi. That's great!
Let me start with a piece of advice: consider learning syntax-rules,
or hygienic, new-style macros instead of the old-style define-macro.
Besides being Scheme's standard macro system, syntax-rules is much
more friendly, readable and safe to use. The next version of Chicken
(Chicken 4) will support syntax-rules by default and will remove
define-macro. In Chicken 3 you can load one of a number of eggs that
provide it, for example alexpander.
Your amb macro looks like this in syntax-rules:
(define-syntax amb
(syntax-rules (m-fail)
((amb alt ...)
(let ((mf m-fail))
(call/cc
(lambda (sk)
(call/cc
(lambda (ck)
(set! m-fail
(lambda ()
(set! m-fail mf)
(ck 'fail)))
(sk alt)))
...
(mf)))))))
Anyways, back to the problem you are having.
I traced it down to the use of (amb) in the top-level and I have a
half idea I've stumbled into a bug in the Chicken interpreter, so I'm
asking for confirmation from the more experienced Chicken hackers here.
In the meantime, as a workaround, you can convert your *street* global
variable into a local variable:
(let ((street (list (make-house ;etc.
(make-house ;etc.
(if (eq? (house-nationality (car street))
(house-nationality (cadr street)))
(amb))
(map show-house street))
Written like this, it works.
--//--
Here are my findings.
I got the same results with all these (amb) implementations:
- the one in the amb egg;
- the define-macro in the OP;
- my hygienic one above, both in Chicken 3 with alexpander and in
Chicken svn head;
so it's not a problem in the specific macro.
This is the smallest example that fails: it prints the unreacheable
message instead of raising the appropriate "Program failed!" or
"expression tree exhausted" error.
(amb 1 2)
(amb)
(print "if you read this, there's a bug somewhere")
To see it fail, you need to:
- put these three calls at the top level, NOT inside any lambda or
begin;
- load the file with csi -s or with (load), NOT compiling it;
- remember to reset the top amb exception (m-fail or amb-failure-
continuation) between tests, better yet if you start a new csi each
time.
Tobia