[plt-scheme] How to execute code in an environment other than it ,isdefined?
Hi Jos,
I like your case-lambda solution even better. I didn't mean to implicate
that you hadn't solve Grant's problem, I was just messing around with
the code; sort of a past time of mine. Sorry if it came across that way.
Best wishes,
--kyle
Jos Koot wrote:
> ----- 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 ,isdefined?
>
>
>> 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
> (case-lambda
> ((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 types.
>
>> 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
>>
>