Почему «args не может быть прочитан во время компиляции» - PullRequest
0 голосов
/ 26 мая 2019

Я пытаюсь использовать 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
    }
}

Но я получаю следующую ошибку:

$ rdmd soq_mycalc.d
soq_mycalc.d(17): Error: variable args cannot be read at compile time
Failed: ["/usr/bin/dmd", "-v", "-o-", "soq_mycalc.d", "-I."]

Где проблема и как ее можно исправить?

Редактировать: я хочу вызвать эту программу с аргументом: "2 + 2" и хочу, чтобы программа рассчитала ее.

Следующее также не работает:

char[] mainarg = args[1].dup;
writeln(mixin(mainarg));  // Error: variable args cannot be read at compile time

1 Ответ

1 голос
/ 30 мая 2019

Если я хорошо понимаю, то, что вы пытаетесь достичь, - это некоторая форма оценки выражений (которая включает анализ грамматики выражений). BASH для примера имеет eval(), который может принимать произвольное выражение в виде строки и возвращать значение (если выражение допустимо).

Насколько мне известно, в стандартной библиотеке

D такой функции нет.

Для простого решения я бы использовал Pegged ( Reference ). DLang Tour's Pegged page - хорошая отправная точка, поэтому я рекомендую начать с нее.

...