D 为什么“args不能在编译时读取”

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:

我尝试在以下代码中使用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: 
        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