Hi Brian,

I think you want define/match.

(define/match (is-pos l)
  [((list r c)) (and (member r (range 0 4))
                     (member c (range 0 r)))])


(is-pos '(2 5)) ; => #f
(is-pos '(2 1)) ; => '(1)

/Jens Axel


2014-07-12 18:53 GMT+02:00 Brian Adkins <racketus...@lojic.com>:
> I'm porting more Haskell code to Racket as a learning exercise. When I got to 
> this line:
>
> isPos (r,c) = elem r [0..4] && elem c [0..r]
>
> I first wrote this:
>
> (define (is-pos r c) (and (member r (lgen 0 4))
>                           (member c (lgen 0 r))))
>
> where lgen is:
>
> (define (lgen m n) (build-list (+ 1 (- n m)) (λ (x) (+ x m))))
>
> I think (lgen 0 r) is a reasonable alternative to [0..r], and the minor 
> additional length of the Racket version is fine.
>
> I then decided that I may prefer to a list of row/col instead of individual 
> args and bumped into a need for destructuring a list, so I wrote this macro:
>
> (define-syntax defpat
>   (syntax-rules ()
>     [(_ (fn pat) b1 b2 ...)
>      (define fn (match-lambda [pat b1 b2 ...]))]))
>
> which allows:
>
> (defpat (is-pos (list r c)) (and (member r (lgen 0 4))
>                                  (member c (lgen 0 r))))
>
> The fact that this is such a common operation and I couldn't find anything 
> built-in makes me think that I may be missing something. Is this a reasonable 
> solution? Are there better alternatives?
>
> I suppose a better name might be in order since it's not matching one of 
> several patterns; in this case, it's really just for destructuring a list 
> more concisely.
>
> I'm still blown away by how easy it was to mold Racket closer to what I 
> wanted. I've just barely begun learning macros, but syntax-rules made this 
> pretty easy.
>
> I think the only thing that sticks out is the "list" function, but that seems 
> like a reasonable sacrifice given the flexibility it allows for in more 
> complicated patterns.
>
> Thanks,
> Brian
>
> --
> Brian Adkins
> Lojic Technologies, LLC
> http://lojic.com/
>
>
> ____________________
>   Racket Users list:
>   http://lists.racket-lang.org/users



-- 
--
Jens Axel Søgaard

____________________
  Racket Users list:
  http://lists.racket-lang.org/users

Reply via email to