D 为什么“args不能在编译时读取”
我尝试在以下代码中使用mixin:D 为什么“args不能在编译时读取”,d,D,我尝试在以下代码中使用mixin: import std.stdio; import std.file; void main(string[] args){ if (args.length != 2) { writeln("usage: ./app < number expression >"); return; } else { // following statements work ok:
import std.stdio;
import std.file;
void main(string[] args){
if (args.length != 2) {
writeln("usage: ./app < number expression >");
return;
}
else {
// following statements work ok:
writeln(args);
writeln(args.length);
writeln(args[1]);
// following 2 statements do not work; same error:
//mixin("writeln("~args[1]~");"); // Error: variable args cannot be read at compile time
writeln(mixin(args[1])); // Error: variable args cannot be read at compile time
}
}
问题在哪里?如何纠正
编辑:我想用参数2+2调用这个程序,并希望程序计算它
以下内容也不起作用:
char[] mainarg = args[1].dup;
writeln(mixin(mainarg)); // Error: variable args cannot be read at compile time
如果我理解的很好,您试图实现的是某种形式的表达式求值,它涉及到解析表达式语法。以BASH为例,它的eval可以将任意表达式作为字符串,如果表达式有效,则返回一个值 据我所知,D标准库没有这样的功能
对于一个简单的解决方案,我将使用。这是一个很好的起点,所以我建议您从这里开始。如何在编译时使用它?args是程序参数,它们在编译程序后会发生变化,并且在每次运行时可能会有所不同。那么这个错误的含义是什么?正如所说的-error:变量args不能在编译时读取。这就是意义所在。mixin用于将字符串编译成可执行的D代码。但这只能通过在编译时读取的字符串来完成。无法在编译时读取args,它是在编译后设置的。如何纠正您需要编写自己的完整代码来编译所需的数字表达式。没有神奇的mixin命令。或者您可以使用std.system call.Ok调用D编译器。解决办法是什么。我想用2+2这样的参数调用这个程序,并希望它计算它。请参阅我上面问题中的编辑。RPN计算器的D主页上有一个示例。这是一个简单的例子,但展示了如何完成您的目标。在dlang.org上,右上角有一个代码示例框。从下拉列表中选择微型RPN计算器。它在命令行上使用类似23+10*的表达式[转换为2+3*10]。如果您不熟悉D,那么代码有点令人生畏,但本质上,它是一个独立的计算器,可以计算命令行中给出的表达式。正如其他人提到的,D没有计算任意D表达式的eval函数。感谢您提供了一个非常有趣和有用的解析包。
char[] mainarg = args[1].dup;
writeln(mixin(mainarg)); // Error: variable args cannot be read at compile time