[plt-scheme] Pattern-matching macro chokes on conditional statement which would otherwise work.
(define (doublequoted-symbol? sym)
(and (pair? sym) (eqv? (car sym) 'quote)))
(define-syntax match
(syntax-rules ()
((match vars [pfirst prest ...] body ...)
(cond
((and (not (doublequoted-symbol? (quote pfirst)))
(symbol? (quote pfirst)))
(let ((pfirst (car vars)))
(match (cdr vars) [prest ...] body ...)))
((eqv? pfirst (car vars))
(match (cdr vars) [prest ...] body ...))
(else #f)))
((match vars [] body ...) (begin body ...))))
(match '(1 2 3) (one 2 three)
(display three))
Sorry for not commenting on the code, but here's a basic idea of what it
SHOULD do:
(match '(1 2 3) (1 2 3) (display 3)) should match perfectly and display 3 on
the terminal (it doesn't).
(match '(1 2 3) (one two three) (display 3)) works perfectly, and prints 3.
(match '(1 2 3) ('one 'two 'three) (display 'one)) - This should fail to
match the pattern altogether, as symbols which are already quoted are
matched for equality, rather than used as identifiers as above. This dies
miserably without returning #f.
(match '(1 2 3) (one 2 three) (display three)) - This should immediately
create an alias for the values 1 and 3 ('one' and 'three) and match the
second values for equality. Unfortunately, this is not the case.
(match '(1 2 3) (one 2 three)
(display three))
... gives the following error:
"let: bad syntax (not an identifier) in: 2"
It seems to be completely ignoring the conditional.
So I performed a test:
(and (not (doublequoted-symbol? (quote 2)))
(symbol? (quote 2)))
... actually returns FALSE. So then why is the conditional statement
branching off completely wrong?
And then, here's the real kill. I can't debug the damn thing.
Doing so sends an alert window flying in my face, and a larger one behind
it.
"rest: expected argument of type <non-empty list>; given ()
=== context ===
C:\Program Files\PLT\collects\mzlib\list.ss:295:2: rest
C:\Program Files\PLT\collects\mztake\debug-tool.ss:804:10: can-step-out?
rest: expected argument of type <non-empty list>; given ()
=== context ===
C:\Program Files\PLT\collects\mzlib\list.ss:295:2: rest
C:\Program Files\PLT\collects\mztake\debug-tool.ss:804:10: can-step-out?
rest: expected argument of type <non-empty list>; given ()
=== context ===
C:\Program Files\PLT\collects\mzlib\list.ss:295:2: rest
C:\Program Files\PLT\collects\mztake\debug-tool.ss:804:10: can-step-out?
rest: expected argument of type <non-empty list>; given ()
=== context ===
C:\Program Files\PLT\collects\mzlib\list.ss:295:2: rest
C:\Program Files\PLT\collects\mztake\debug-tool.ss:804:10: can-step-out?
rest: expected argument of type <non-empty list>; given ()
=== context ===
C:\Program Files\PLT\collects\mzlib\list.ss:295:2: rest
C:\Program Files\PLT\collects\mztake\debug-tool.ss:804:10: can-step-out?
rest: expected argument of type <non-empty list>; given ()
=== context ===
C:\Program Files\PLT\collects\mzlib\list.ss:295:2: rest
C:\Program Files\PLT\collects\mztake\debug-tool.ss:804:10: can-step-out?
rest: expected argument of type <non-empty list>; given ()
=== context ===
C:\Program Files\PLT\collects\mzlib\list.ss:295:2: rest
C:\Program Files\PLT\collects\mztake\debug-tool.ss:804:10: can-step-out?"
^ Can someone tell me what the hell is going on?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/users/archive/attachments/20080119/fbecbeb6/attachment.html>