9 hours ago, Laurent wrote: > Thank you all for your good and helpful answers. Based on them, > here is my current solution (without keywords), using macros to ease > the function definition: > > #lang racket > > (define default (gensym)) > (define (default? x) (equal? x default))
(Using `eq?' here is a common idiom.) In any case, the real point here is not the macro -- it's the existence of a special `none' value that marks an unsupplied value. It's potentially a convenient thing to have (which I wish for every time I do that `gensym' dance), but it gets tricky with the fact that you might want to actually use that value -- same as the undefined value (which you get from (letrec ([x x]) x)) which could be used for the same purpose. (This comes up in other places like struct initialization with optional fields -- in swindle I used the undefined value for that. This is done in a similar way to what TR does: a field can have a guard, but the undefined value is allowed as an exception because of this kind of use.) -- ((lambda (x) (x x)) (lambda (x) (x x))) Eli Barzilay: http://barzilay.org/ Maze is Life! ____________________ Racket Users list: http://lists.racket-lang.org/users