[plt-scheme] redex

From: Casey Klein (clklein at cs.uchicago.edu)
Date: Wed Jan 21 08:40:40 EST 2009


On Wed, Jan 21, 2009 at 6:19 AM, Jos Koot <jos.koot at telefonica.net> wrote:
> However, when I try:
> (traces red (term ((λ (x) (x x x)) (λ (x) (x x x)))))
> I get:
> Welcome to DrScheme, version [3m].
> Language: Module; memory limit: 1000 megabytes.
> syntax: incompatible ellipsis match counts for template in: ...
> No indication where.
> I carefully checked all ellipses, but cannot find any improper use.

This simpler term has the same behavior:

   (term ((λ (y) y) 1 2))

The error message isn't very helpful, but here's what's happening.
This term matches the "βv" rule with `x' bound to '(y) and `v' bound
to '(1 2):

> (redex-match λv (in-hole E ((λ (x ...) e) v ...)) (term ((λ (y) y) 1 2)))
(#(struct:match (#(struct:bind E #(struct:hole))
                          #(struct:bind e y)
                          #(struct:bind v (1 2))
                          #(struct:bind x (y)))))

This rule's right-hand side requires `x' and `v' to be bound to
equal-length lists because it "zips" them into a new list with "(x v)
...". This syntax-case expression has the same problem (but a better
error message):

(syntax-case #'((a b) (1 2 3)) ()
  [((x ...) (v ...))
   #'((x v) ...)])

The "βv" rule should probably be written

   (--> (in-hole E ((λ (x ..._1) e) v ..._1))
          (in-hole E (subst-n (x v) ... e))

so it doesn't fire when the argument count doesn't match the parameter count.

> I also noticed that
> (traces red (term (((λ x (λ y x)) y) z)))
> does not contract.
> That's due to the capture avoidance.

First, you're missing the parens around the parameter names; i.e., you
want (term (((λ (x) (λ (y) x)) y) z)). But more to the point, "βv"
applies only when the arguments are values, and according to the λv
grammar, a variable is not a value:

   (v (λ (x ...) e) number +)


Posted on the users mailing list.