Преобразуйте аргумент sweet.js в строку

Как бы вы создали строку из аргумента в макросе sweet.js? Например:

let foo = macro {
    rule {
        $name
    } => {
        console.log('$name', $name);
    }
}

var x = 42;

foo x

Будет выводить:

console.log(x, x);

Когда я предпочитаю вывод:

console.log('x', x);

Таким образом, первый аргумент имеет кавычки вокруг него.

1 ответ

Решение

Вы можете использовать кейс-макрос:

let foo = macro {
    case {_
        $name
    } => {
        letstx $name_str = [makeValue(unwrapSyntax(#{$name}), #{here})];
        return #{
            console.log($name_str, $name);
        }
    }
}

var x = 42;

foo x

Основная идея заключается в том, что вы создаете новый строковый токен (через makeValue) используя строковое значение идентификаторов, сопоставленных $name (unwrapSyntax дает нам значение заданных объектов синтаксиса, в случае идентификаторов это строка идентификатора). затем letstx позволяет нам связать наш недавно созданный объект синтаксиса для использования внутри #{} шаблон.

Другие вопросы по тегам