在运行时写程序
最后,让我们回到我们之前看过的程序(eval4.rb),它提示用户输入字符串以在运行时(runtime)定义代码,执行这些字符串并从中创建新的可运行方法。
该程序的一个缺点是它必须要求每个方法的代码都输入一行中。事实上,编写一个允许用户输入跨越多行的方法的程序非常简单。例如,这里是一个程序,它执行输入的所有代码,直到输入一个空行:
writeprog.rb
program = ""
input = ""
line = ""
until line.strip() == "q"
print( "?- " )
line = gets()
case( line.strip() )
when ''
puts( "Evaluating..." )
eval( input )
program += input
input = ""
when 'l'
puts( "Program Listing..." )
puts( program )
else
input += line
end
end
你可以通过输入整个方法然后输入空行来尝试一下(当然只输入代码,而不是注释):
def a(s) # <= press Enter after each line
return s.reverse # <= press enter (and so on...)
end
# <- Enter a blank line here to eval these two methods
def b(s)
return a(s).upcase
end
# <- Enter a blank line here to eval these two methods
puts( a("hello" ) )
# <- Enter a blank line to eval
#=> Displays "olleh"
puts( b("goodbye" ) )
# <- Enter a blank line to eval
#=> Displays "EYBDOOG"
输入每行后,会出现提示符('?-'
),除非程序正在执行代码的过程中,在这种情况下,它会显示 “Evaluating” 或显示执行结果,例如 “olleh”。
如果你完全按照上面的说明输入文本,那么你应该看到:
Write a program interactively.
Enter a blank line to evaluate.
Enter 'q' to quit.
?- def a(s)
?- return s.reverse
?- end
?-
Evaluating...
?- def b(s)
?- return a(s).upcase
?- end
?-
Evaluating...
?- puts(a("hello"))
?-
Evaluating...
olleh
?- b("goodbye")
?-
Evaluating...
EYBDOOG
这个程序还很简单。它没有任何基本的错误恢复功能,更不用说花哨的东西,如文件保存和加载功能。即便如此,这个小示例也证明了在 Ruby 中编写自修改(self-modifying)程序是多么容易。使用本章概述的技术,你可以从给定语法规则的自然语言解析器为冒险游戏创造任何东西,这个过程中你可以探索新的困惑。
在本书中,我们涵盖了很多基础内容 - 从 “hello world” 到动态编程(dynamic programming)。剩下的要靠你自己了。
这才是冒险真正开始的地方。