Just for fun, I made a function to do this the “non-eval” way, and it was more complicated than I would have thought, although maybe I was overcomplicating it a bit? https://github.com/AlexKnauth/hash-lambda/blob/master/keyword-lambda/kw-apply.rkt
On Aug 9, 2014, at 10:10 AM, Sean Kanaley <skana...@gmail.com> wrote: > There's a simple enough example I think: apply with keyword parameters. Apply > has that built-in..sort of...but the list is supposed to be provided inline > to APPLY, seemingly requiring apply to be applied (e.g. (apply apply (cons > *thefunctiontoapply* params))), except keywords can't be expressions anyway. > I have a bunch of card definitions for Dominion with many defaults: > > (struct card (... actions buys ...)) > > (define (make-card ... #:actions actions #:buy buys ...) > ...) > > The non-keyword-requiring way is > > (define CARDS > (map (\ (lst) (apply make-card lst)) > '([... 1 1 ...] > [... 2 0 ...]))) > > The keyword way is > > ;ns is namespace > (mapply (\ (lst) (eval `(apply make-card ',(car l) ,@(cdr l)) ns)) > '([(...) #:actions 1 #:buys 1 ...])) > > Short of making a big macro to take some exact format and get it to work with > keywords and all that, eval seems to be just what is needed. > > > On Sat, Aug 9, 2014 at 8:27 AM, Neil Van Dyke <n...@neilvandyke.org> wrote: > Sounds like a good rule of thumb. Two suggestions to add: > > * Maybe there could also be a second rule of thumb, like, "If you need > arbitrary Racket expressions, then consider whether you can do it with one of > the following patterns: [list some patterns involving combinations of syntax > extension, custom #lang, dynamic requires, considering whether config files > can actually be compile-time #lang, etc.]" This is less important than the > first rule of thumb. > > * When we list typical newbie cases that don't actually require "eval", we > can expect that newbie will immediately want an example of the non-"eval" way > to do that typical thing. At the very least, an example showing, say, good > use of hashes in parameters, with a sensible thin abstraction layer over it, > for that case. These examples would be tedious to work through and write up > well, but someday some knowledgeable and benevolent person will do it. (I am > not this person. Book royalties aren't enough to ease the pain. I'd rather > that newbies just never heard of "eval" or were scared away from it, rather > than having to talk them down off the ledge all the time.) > > Neil V. > > > Eli Barzilay wrote at 08/09/2014 07:31 AM: > > I think that I ran into a nice way to discourage eval except when > needed: the rule of thumb is to only use eval when you need to evaluate > any arbitrary (Racket) expression. It sounds simplistic but it covers > lots of cases that make newbies run to eval: > > * I just want to get the value of a variable whose name is held in x > > * More common: I have a symbol/string that names a function, I just need > to call that function > > * I need to keep an update-able mapping from names to values, just like > what the toplevel does > > * I want to let people write an arithmetic expression instead of a > number > > In such cases questions like "do you need allow calling all functions", > and "do you need to handle lambda expressions" have negative answers. > > > > On Sun, Jul 27, 2014 at 4:16 PM, Neil Van Dyke <n...@neilvandyke.org> wrote: > Maybe there should be a periodic public service announcement about not using > "eval". This time I will communicate in FAQ format: > > Q: How do I use eval? > A: Don't use eval. > > Q: But don't so many academic books feature eval prominently, so doesn't > that mean I should use try to eval? > A: Those books use eval for pedagogic reasons, or because the author is > enamored of some theoretical appeal of eval, or because the author wants to > watch the world burn. Don't use eval. > > Q: But, but, but, I am just starting to learn, and eval seems to do what I > need. > A: Eval is almost certainly not what you want. Learn how to use the other > basics effectively. Don't use eval. > > Q: I now am very comfortable with the language, I am aware that I should > avoid eval in almost all cases, and I can tell you why eval is actually the > right thing in this highly unusual case. > A: Cool, that's why eval is there. > > Neil V. > > > > ____________________ > Racket Users list: > http://lists.racket-lang.org/users > > ____________________ > Racket Users list: > http://lists.racket-lang.org/users
____________________ Racket Users list: http://lists.racket-lang.org/users