构建计算器的一种简单方法是不需要自己解析输入字符串,---即,如果可以依靠语言的内置计算器来完成。
为了实现这一点,人们期望存在某种"函数"F(std::string X)
,它接受诸如"7 + 3"
之类的字符串并删除其引号。这将允许一个人这样做:int k = F("7 + 3") = 7 + 3
.
除了计算器之外,如果我想输入报表怎么办?假设我想在我的程序中保留一行F(argv[1]);
,在那里可以输入"std::cout << 'Hello, World!'
"或"break
"或"case 17817:
"等内容。C++我们可以从命令行为变量赋值:那么为什么我不能设置一个占位符,不是为数字、字符或字符串,而是为整个语句设置占位符呢?
如果我的假设是正确的,我妄想期待这样的东西存在。尽管很明显,随着此类功能的存在,会出现无数问题,但我仍然想知道在实现仅删除字符串周围的引号的东西时会存在哪些困难。
问题:C++或Python中是否存在这样的"函数"F,无论是简单的表达式还是成熟的语句?
这样的函数存在于 Python 中。它是解释任意字符串的eval
函数。例如,您可以在 Python 解释器中尝试以下操作:
>>> def calc(e):
... return eval(e)
...
>>> calc("2+3")
5
eval
函数可以采用任意有效的 Python 语句。因此,正如您可能猜到的那样,一般来说,eval
使用起来不安全,因为它可以被攻击者利用。
大多数解释型语言,如JavaScript,Ruby等,确实提供了这样的动态评估函数。但是,这在编译语言(如C++(中是不可能的。不能简单地在运行时"解释"字符串 - 必须首先调用编译器来解析,编译和生成可执行代码。