[racket-dev] Proposal for a "no-argument"
Quick summary: I'll remove the #:before-first and #:after-last
feature. If anyone wants them, please tell me -- maybe it can be left
for the spliced case, or maybe they could always be spliced.
On Monday, Matthew Flatt wrote:
> I'm not enthusiastic about this proposal.
>
> As you say at the start, it seems like a rare case. My main
> objection is that it's too rare to merit a change to the main
> `lambda' form and other parts of our infrastructure, such as
> documentation tools.
This -- a more substantial extension of `lambda' and friends -- seems
to be the core issue here. I've talked about it to Matthias, and we
agreed on something that would help. I'll post about it separately,
when I land.
> As a weaker objection, I don't agree with the suggestion that naive
> users can somehow ignore the `no-argument' value. I think it would show
> up prominently in documentation, contracts, and types.
I didn't mean that they'll ignore it -- I meant that having a default
expression that is rendered as "no-argument" or something similar is
self explanatory in a better way than "....", and definitely from an
additional #:nothing argument (which is an actual interface change in
addition to being obscure).
> Weaker still, in terms of how well I can defend it: I'm suspicious
> of "no-value" values in general. Granted, we already have `#f',
> #<void>, and #<undefined>, but I'm not really happy about that (and
> I keep thinking about ways to get rid of #<undefined>).
This could be solved, roughly, by what both Robby and Matthias
suggested (protecting it from leaking out), but on one hand there's a
problem with that, and on the other it makes it equivalent to exposing
a boolean flag for the presence of an argument. That's the thing that
I'll delay for a proper post on that. Side-question: do you have some
potential direction for eliminating #<undefined>? (Asking because it
might apply here too.)
(Is there any problem with #<void>?)
Meanwhile, the interface change, the gensym-encouraging, and the
obscurer explanation really bother me, so I'll just get rid of the
need for them by removing the #:before-first and #:after-last feature.
--
((lambda (x) (x x)) (lambda (x) (x x))) Eli Barzilay:
http://barzilay.org/ Maze is Life!