2014-02-18 2 views
2

Как бы вы создали строку из аргумента в макрос 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); 

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

ответ

5

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

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

var x = 42; 

foo x 

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

+0

Отлично, я думал, что мне, возможно, придется использовать макрос для случая, но каждый раз, когда я пытался разобраться, как я закончил с синтаксическими ошибками, но ваше объяснение хорошо его очищает –

Смежные вопросы