2014-01-09 2 views
2

Я хочу развернуть токен на строку. Например, у меня есть этот макрос:Sweet.js - Развернуть токен как строку

macro String { 
    rule { 
    $x 
    } => { 
    "$x" 
    } 
} 

Я бы ожидать String 1 расширить до "1", однако он расширяется только 1;

Как я могу это сделать?

EDIT: Это, кажется, невозможное сделать с декларативным подходом, но должно быть возможным с императивным подходом (см this comment):

macro String { 
    case {_ $x } => {   
    return #{"$x"} 
    } 
} 

Но это все еще расширяется в кавычки.

+0

Вы пытались использовать toString()? – felipekm

+0

@FelipeKM Это просто расширит 'toString()' в результате. Кавычки должны быть добавлены макросом. – jviotti

+0

@jviotti Я нашел эту проблему в Github от Sweet.js: https://github.com/mozilla/sweet.js/issues/45 Кажется, именно то, что вы хотите, но она была закрыта без каких-либо упоминаний о том, как на самом деле это делать , – ToastyMallows

ответ

4

Как указано в this issue thread, вы можете сделать это с императивным подходом, но это немного неудобно и недостаточно хорошо документировано. В принципе, вы делаете это так:

macro String { 
    case {_ $x} => { 
    var pattern = #{$x}; 
    var tokenString = pattern[0].token.value.toString(); 
    var stringValue = makeValue(tokenString, #{$here}); 
    return withSyntax($val = [stringValue]) { 
     return #{$val}; 
    } 
    } 
} 

Кстати, я бы не назвал этот макрос «String» - это вступает в противоречие с существующей строкой, что это изначально часть JavaScript.

+0

http://sweetjs.org/browser/editor.html#macro%20makeString%20%7B%0A%20%20case%20%7B_%20$x%7D%20=%3E%20%7B%0A% 20% 20% 20% 20var% 20pattern% 20% = 20% # $ 7B х% 7D;% 0A% 20% 20% 20% 20var% 20tokenString% 20% = 20pattern% 5B0% 5D.token.value;% 0A % 20% 20% 20% 20var% 20stringValue% 20 =% 20makeValue (tokenString,% 20 #% 7B $ здесь% 7D);% 0A% 20% 20% 20% 20return% 20withSyntax ($ Вэл% 20 =% 20% 5BstringValue% 5D)% 20% 7B% 0A% 20% 20% 20% 20% 20% 20return% 20 #% 7B $ вал% 7D;% 0A% 20% 20% 20% 20% 7D% 0A% 20% 20 % 7D% 0A% 7D% 0A% 0AmakeString% 204 Я все еще получаю только '4', а не' '4" '. – ToastyMallows

+0

Работы для nonnumber. 'Строка! = "!" ', String something =' something'. Остальные номера остаются без кавычек. – jviotti

+1

@jviotti: Хорошая точка. Я думаю, что мы можем просто подкрепить его. Обновлен и, похоже, работает в редакторе Sweet.js со всеми типами. – Chuck

3

Хотя вам все еще нужно использовать макрос случай, это может быть более кратким, чем ответ Чака, используя unwrapSyntax и letstx:

macro makeStr1 { 
    case {_ $x} => { 
    var pattern = #{$x}; 
    var asStr = unwrapSyntax(pattern).toString(); 
    letstx $xStr = [makeValue(asStr, pattern)]; 
    return #{$xStr}; 
    } 
} 

Мы можем сделать лучше, хотя. Как насчет макросов в макросах?

macro syntaxToStr { 
    rule {$x} => { 
    [makeValue(unwrapSyntax($x).toString(), $x)] 
    } 
} 

macro makeStr { 
    case {_ $x} => { 
    letstx $xStr = syntaxToStr(#{$x}); 
    return #{$xStr} 
    } 
} 
Смежные вопросы