You can already set! top level variables (or any variables) bound to
functions.
$ racket
Welcome to Racket v6.12.
> (define (f) 1)
> (f)
1
> (set! f (lambda () 2))
> (f)
2
Alternatively, here is a little example of how you might define lambda-box:
#lang racket
(struct lambda-box ([proc #:mutable])
#:property prop:procedure
(make-keyword-procedure
(λ (kws kw-args this . by-pos-args)
(keyword-apply (lambda-box-proc this)
kws
kw-args
by-pos-args))))
(define f
(lambda-box (λ () 1)))
(f)
(set-lambda-box-proc! f (λ () 2))
(f)
I guess my bigger question is whether making everything redefinable is
really the best mechanism to achieve what you want. I would bet that, even
in your example, you don't usually want to dynamically redefine cons or +.
I think it would probably be better to be explicit about where you want to
allow redefinition and where you want identifiers to refer to a specific
binding.
If I were thinking about "a multiplayer game … where you could change the
world while players are in it without kicking them out," I might think
about a current-world parameter that can be mutated and having certain
functions consult the current-world. Using the class-based object system or
racket/generic for the world value might be particularly suitable. (Of
course, the details would depend on exactly what about the world you want
to be able to change.)
-Philip
On Wed, Mar 21, 2018 at 1:16 PM, Christopher Lemmer Webber <
[email protected]> wrote:
> Hi Sam! I wasn't familiar with racket/load and it seems neat.
> But it either seems too hopeless, or not hopeless enough:
>
> Since all forms within a racket/load module are evaluated in the top
> level, bindings cannot be exported from the module using provide.
>
> This seems like a bit too much unfortunately. If I were to be writing
> for instance a web application or a game or what have you, I'd still
> want the dynamism of being able to redefine things, but I'd also want to
> be able to export things from a module.
>
> Maybe here's a properly hopeless level of indirection? What if we had
> something like a lambda-box that for toplevel definitions of functions
> instead wrapped the function in a box. It can still be invoked, but if
> redefined, the contents of the box could be swapped out with a new
> function? That's not too far off from how Guile's redefining works
> presently, if I understand right. Redefining a toplevel non-function
> could just set! the variable.
>
> I guess maybe you couldn't provide more than what you've already
> provided from the module. But that's probably okay?
>
>
> Sam Tobin-Hochstadt writes:
>
> > You might find the racket/load language useful for this.
> >
> > Sam
> >
> > On Wed, Mar 21, 2018, 12:49 PM Christopher Lemmer Webber <
> > [email protected]> wrote:
> >
> >> Just curious. I have my reasons... for instance, I wrote a multiplayer
> >> game in Guile where you could change the world while players are in it
> >> without kicking them out. I don't think you can do that while having a
> >> toplevel that's as fixed as Racket's is.
> >>
> >> I've read the emails from Matthew Flatt about "the toplevel is
> >> hopeless". So the question is... how hard would it be to support
> >> "#lang hopeless"? :) A language for the toplevel!
> >>
> >> Maybe the toplevel is generally hopeless, but those of us who wish to
> >> live in a world of despair can happily still have it.
> >>
> >> --
> >> You received this message because you are subscribed to the Google
> Groups
> >> "Racket Users" group.
> >> To unsubscribe from this group and stop receiving emails from it, send
> an
> >> email to [email protected].
> >> For more options, visit https://groups.google.com/d/optout.
> >>
>
> --
> You received this message because you are subscribed to the Google Groups
> "Racket Users" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> For more options, visit https://groups.google.com/d/optout.
>
--
You received this message because you are subscribed to the Google Groups
"Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.