On Jul 15, 2014, at 6:37 PM, Stephen Chang <stch...@ccs.neu.edu> wrote:
>> Also I was thinking I could use it to make gen-bind expanders for >> match-patterns if I need them. > > There's a define-match-bind that consumes a match pattern and defines > a $-prefixed name for that specific pattern that can be used in > gen-bind positions. Does that help? Oh. When I saw that I thought it was just for structs. > > >> >>> >>> >>>> And is there some kind of "generic-bind/renamed” module or something that >>>> provides everything from generic-bind except without the ~ in front? >>> >>> Good idea. Yes, in hindsight my choice of names was probably >>> suboptimal. I've incorporated your suggestion so now you can do >>> (require generic-bind/as-rkt-names), which drops all ~-prefixes >>> (except for ~vs). Thanks! >>> >>> >>>> >>>> >>>> On Jul 15, 2014, at 3:02 PM, Stephen Chang <stch...@ccs.neu.edu> wrote: >>>> >>>>>> I just found this, which has a lot of forms for just about everything I >>>>>> can think of (and more) that support things like match-patterns: >>>>>> https://github.com/stchang/generic-bind >>>>>> >>>>>> I haven’t tried it yet, but It looks pretty amazing. >>>>>> >>>>>> It probably has everything you want. >>>>> >>>>> Thanks for the kind words. :) >>>>> >>>>> This was an experiment that tried to address a few questions that >>>>> repeatedly get asked on the mailing list: >>>>> >>>>> 1) that you can't destructure data structures at the binding site, and >>>>> 2) that you need to manually define many different versions of each >>>>> binding construct (eg define, match-define, match-define-values, etc), >>>>> which inevitably means that some binding forms don't exist (eg >>>>> match-for/X forms) >>>>> >>>>> Something like the expressivity problem for binding forms. >>>>> >>>>> I tried to implement one "generic" version of each binding form that >>>>> would accept many different "binding instances", so every binding form >>>>> would be extensible by implementing the appropriate instance (eg, a >>>>> matching instance, a values instance) >>>>> >>>>> Every Racket binding form should have a ~-prefixed version in my >>>>> library and my version should work as a drop-in replacement for its >>>>> Racket counterpart if you want to try it out. >>>>> >>>>> Here's a link to the docs if you're interested in reading more: >>>>> http://stchang.github.io/generic-bind/generic-bind.html >>>>> >>>>> (You can tell that it hasn't been updated in a while from the old css.) >>>>> >>>>> Caveat: my macro-fu hasn't quite reached expert level so I'd love for >>>>> anyone to tell me where my code is bad. >>>>> >>>>> That being said, I ran a large part of the Racket test suite using my >>>>> binding forms instead of the Racket ones so they should be usable in >>>>> most scenarios. >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>>>> >>>>>> On Jul 13, 2014, at 12:41 AM, Alexander D. Knauth <alexan...@knauth.org> >>>>>> wrote: >>>>>> >>>>>>> >>>>>>> On Jul 12, 2014, at 10:17 PM, Alexander D. Knauth >>>>>>> <alexan...@knauth.org> wrote: >>>>>>> >>>>>>>> >>>>>>>> On Jul 12, 2014, at 6:43 PM, Brian Adkins <racketus...@lojic.com> >>>>>>>> wrote: >>>>>>>> >>>>>>>>> I probably won't keep my defpat macro, at least not in its present >>>>>>>>> form (for one, it only handles a single arg); there's probably a >>>>>>>>> balance between being concise and being general/flexible. >>>>>>>> >>>>>>>> Although define/match is definitely more powerful, if you want it, >>>>>>>> this would probably be a good version of what you want that would >>>>>>>> handle multiple arguments: (I’ll reply again if I get one to work >>>>>>>> with optional and/or keyword-arguments) >>>>>>>> (define-syntax defpat >>>>>>>> (syntax-rules () >>>>>>>> [(defpat (f arg-pat ...) body ...) >>>>>>>> (defpat f (match-lambda** [(arg-pat ...) body ...]))] >>>>>>>> [(defpat id expr) >>>>>>>> (define id expr)])) >>>>>>> >>>>>>> Ok I just made a version of defpat that can handle multiple arguments, >>>>>>> optional arguments, keyword-arguments, and optional keyword-arguments. >>>>>>> I also made a form called my-match-lambda that defpat uses to do this. >>>>>>> https://github.com/AlexKnauth/defpat >>>>>>> Also to do this I had to make it so that you have to use square >>>>>>> brackets to specify optional arguments, otherwise it couldn’t tell >>>>>>> between an optional argument and a match pattern. >>>>>>> >>>>>> >>>>>> >>>>>> ____________________ >>>>>> Racket Users list: >>>>>> http://lists.racket-lang.org/users >>>> >> ____________________ Racket Users list: http://lists.racket-lang.org/users