[plt-scheme] How to execute code in an environment other than it , isdefined?

From: Jos Koot (jos.koot at telefonica.net)
Date: Sun Jul 15 16:59:24 EDT 2007

----- Original Message ----- 
From: "Kyle Smith" <airfoil at bellsouth.net>
To: <plt-scheme at list.cs.brown.edu>; <grettke at acm.org>; <jos.koot at telefonica.net>
Sent: Sunday, July 15, 2007 10:23 PM
Subject: Re: [plt-scheme] How to execute code in an environment other than it 

> Hi Grant and Jos,
> I believe you can construct the syntax such that no extraneous
> variable need to be added.

What your mascro does can as well and simpler be done by a procedure.

(define pick-from
  ((proc to) (pick-from proc 1 to))
  ((proc from to) (iter proc from to)))

A contract can be added to make sure that proc, from and to have the right 

> Check out my take on your syntax
> below.  I've also corrected for the annoying attribute of range
> that acts like a C `for' statement, in that if you specify a range
> of from 1 to 100, you actually get 1 to 99.  Finally, I added
> fenders and syntax/loc to provide for more specific error
> reporting.  You could also match on the lambda glyph, but
> they don't show up on the newsgroup well, so I left it out.
> (module pick-from mzscheme
>  (require (lib "42.ss" "srfi"))
>  (provide pick-from)
>  (define (iter f from to)
>    (list-ec  (:range x from (add1 to))
>              (if (f x))
>              x))
>  (define-syntax pick-from
>    (lambda (stx)
>      (syntax-case stx ()
>        [(_ (lambda (var) expr) from to)
>         (identifier? #'var)
>         (syntax/loc stx
>           (iter (lambda (y) ((lambda (var) expr) y)) from to))]

"(lambda (y) ((lambda (var) expr) y))" can as well be written as
"(lambda (var) expr)"which can as well be written as:
"proc" as in the last two cases (and omitting the fender)

As I understoor the question of Grant, he wanted to simplify
(pick-from (lambda (x) expr) from to)
such as to releave the user from typing "(lambda (" and ")" and another ")"

Best wishes, Jos Koot

>        [(_ (lambda (var) expr) to)
>         (identifier? #'var)
>         (syntax/loc stx
>           (iter (lambda (y) ((lambda (var) expr) y)) 1 to))]
>        [(_ proc (from to))
>         (identifier? #'proc)
>         (syntax/loc stx
>           (iter proc from to))]
>        [(_ proc to)
>         (identifier? #'proc)
>         (syntax/loc stx
>           (iter proc 1 to))]))))
> (require pick-from)
> (pick-from  (lambda (a) (zero? (modulo a 3))) 50 100)
> (pick-from even? 100)
> (pick-from odd? 100)
> (define triple? (lambda (a) (zero? (modulo a 3))))
> (pick-from triple? 100)
> Enjoy!
> --kyle
> airfoil at bellsouth dot net
> schemekeys.blogspot.com
> www.schemekeys.net

Posted on the users mailing list.