Praxis – A live coding environment based on Lua, Lisp and Forth
github.com63 pointsby createuniverses21 comments
do
local state = 0
function render()
drawLine(0,5,0, 0,5,50*math.sin(state))
state = state + math.pi * 0.03
end
end
To fiddle with the "state" variable from the outside: name,val = debug.getupvalue(render, 1)
print(name) -- state
print(val) -- state's value
debug.setupvalue(render, 1, 0) -- set state to 0
To find out how many upvalues are available: dt = debug.getinfo(render)
print(dt.nups)
If you want to redefine render without disturbing state, you need to backup state and make a new closure with the new definition of render and the restored state: do
local savedstate = {debug.getupvalue(render,1)}
local state = savedstate[2]
function render()
local h = 5
drawLine(0,h,0,50 * math.sin(state), h,0)
state = state + math.pi * 0.06
end
end
I don't think its possible (or I don't know how) to redefine a function inside a closure. So just make a new closure and restore its state.
https://github.com/createuniverses/praxis
I wrote it for myself mainly, so a lot of the features are undocumented and hidden away. But you can have a look at fnkeys.lua, editor.lua and keymap.lua to get a general idea. These are in prods/syntax2015continued. You can bring these up in praxis and make whatever changes you like to the live system.
I like the idea of making it keyboard and buffer driven to an extreme, like the Commodore 64. For example, one simple technique I like is to "inject" code into the current buffer to place objects:
Then calling makeCamPosSaver injects a bit of code that will move the camera back where it was when you called it.
Another example: pressing F3 creates a new buffer where you are supposed to fill in a string with what you are searching for. When you run that buffer, it will switch to the old one that spawned it, and move the cursor to the next occurrence of the search string.
There are more creative ways to use this that others could come up with I'm sure.