我观看了一个众所周知的视频,前苹果UI设计师Bret Victor在源代码中改变了一个符号之后,立即更新了运行代码,展示了令人惊叹的演示.
为了让那些没有看到或没有时间观看视频的人明白我的问题:我想使用这样的工具来编写我自己的软件.他演示的工具是否可用,还是有其他类似的工具?
无论哪种语言/环境都无关紧要,我只想让我的代码运行然后在源代码中更改一行,并立即看到更新的结果而不重新启动它.
我喜欢能够修改发送到函数的参数,使用settrace,如:
import sys
def trace_func(frame,event,arg):
value = frame.f_locals["a"]
if value % 2 == 0:
value += 1
frame.f_locals["a"] = value
def f(a):
print a
if __name__ == "__main__":
sys.settrace(trace_func)
for i in range(0,5):
f(i)
Run Code Online (Sandbox Code Playgroud)
这将打印:
1
1
3
3
5
Run Code Online (Sandbox Code Playgroud)
你还可以使用其他很酷的东西settrace吗?
在观看Bret Victor的演讲视频后,我受到启发,写了一个与他在演讲中展示的开发环境有些类似的快速黑客.
基本上这个想法是,一个人在一个窗口中运行app,每当一个人在源文件中保存更改时程序就会改变.
这适用于小的更改,除了我不能在不关闭应用程序和重新编译的情况下更改代码中的状态类型.
如何解决表达式问题并使我的状态的数据类型能够更改而不会导致重新编译?
PS这是代码.我原本不想发帖,因为它真的很乱,而且很快被黑客攻击,但是人们想要它,所以他们可以得到它.
首先是显示器和空闲模块,(这是一个快速的黑客,所以我没有弄清楚如何将它们作为真正的模块).
Idle.hs
\state -> do
counter <- readIORef state
writeIORef state ((counter + 1)`mod`3)
postRedisplay Nothing
Run Code Online (Sandbox Code Playgroud)
Display.hs
\state -> let
cube w = do
renderPrimitive Quads $ do
vertex $ Vertex3 w w w
vertex $ Vertex3 w w (-w)
vertex $ Vertex3 w (-w) (-w)
vertex $ Vertex3 w (-w) w
vertex $ Vertex3 w w w
vertex $ Vertex3 w w (-w)
vertex $ Vertex3 (-w) w (-w) …Run Code Online (Sandbox Code Playgroud) 在为我的编程语言实现解释器时,我首先想到了一个简单的控制台窗口,它允许用户输入一些代码,然后作为独立的程序作为shell执行.
但是存在严重的问题:如果用户输入的每一行代码都作为独立程序处理,它必须通过标记器和解析器,然后由解释器执行 - 那么函数呢?
例:
>> def x:
>> print("Blah")
>>
>> x()
Run Code Online (Sandbox Code Playgroud)
函数存储在哪里,以便可以随时调用它?
交互式控制台如何将所有输入的内容视为一个程序,而不是一遍又一遍地执行所有操作?
考虑以下:
def test(s):
globals()['a'] = s
sandbox = {'test': test}
py_str = 'test("Setting A")\nglobals()["b"] = "Setting B"'
eval(compile(py_str, '<string>', 'exec'), sandbox)
'a' in sandbox # returns False, !What I dont want!
'b' in sandbox # returns True, What I want
'a' in globals() # returns True, !What I dont want!
'b' in globals() # returns False, What I want
Run Code Online (Sandbox Code Playgroud)
我甚至不确定如何询问,但我希望函数的全局范围成为我打算运行它的环境,而不必在eval期间编译函数.这可能吗?
感谢您的任何意见
解
def test(s):
globals()['a'] = s
sandbox = {}
# create a new version of test() that uses the …Run Code Online (Sandbox Code Playgroud) python ×4
demo ×1
eval ×1
haskell ×1
ide ×1
interactive ×1
interpreter ×1
ruby ×1
sandbox ×1
scope ×1