繁体   English   中英

使用Javascript标记模板文字编写解释器

[英]Writing Interpreter Using Javascript Tagged Template Literals

你有没有想过如果你可以在普通的旧Javascript中使用其他语言中你最喜欢的功能,那就太酷了。 例如,我希望能够使用F#管道运算符'|>',但JS中的管道运算符的提议只是第1阶段的ATM。

对于初学者,我试图启用使用修复后的表示法,即'1 2 +'= 3.我认为使用ES6标记模板文字我可能会到达某个地方,但我在这里几乎没有表面。 这只是一个概念证明。

 const Interpret = (strings, ...expressions) => { const hasPlus = strings.map(s => s.trim()).join('').match(/[+]$/) return hasPlus ? expressions.reduce((t, c) => t + c, 0) : null } const a = 1 const b = 2 const c = 3 const d = 4 const result = Interpret`${a} ${b} ${c} ${d} +` console.log(result) // 10 

而且,我偶然发现了一个很大的障碍。 标记模板文字函数的签名如下 - myTag(strings:string [],... expressions)。 表达式可以是数字,字符串,布尔函数等等。 问题是字符串和表达式的原始顺序显然已丢失。

如果您可以访问一系列字符串和表达式,保留原始顺序(它们在反引号之间出现的顺序),那就太棒了。

因为这将使我能够像这样评估数组的元素:我是否得到了一个表达式,很棒,将它推入堆栈(只是一个启动器数组)...接下来我得到了一个表达式,很酷,也推动它到堆栈...接下来我得到了一个表达式,不 - 这是加号运算符。 现在我可以将值'a'和值'b'与前两个表达式求值并将它们提供给plus运算符(很可能是一个函数)。 接下来将返回值压入堆栈,依此类推。

有没有人知道如何采取下一步或可能转向另一个方向?

这似乎是向前迈出的一步,感谢mpm。

 const Interpret = (strings, ...expressions) => { const raw = strings .map( (s, i) => s + (expressions[i] || '') ) .map(s => s.trim()) const plusPosition = raw.findIndex(s => s.match(/[+]/)) return raw.slice(0, plusPosition).reduce((t, c) => t + parseInt(c), 0) } const a = 1 const b = 2 const c = 3 const d = 4 const result = Interpret`${a} ${b} ${c} ${d} +` console.log(result) 

我很确定顺序不会丢失,否则字符串模板将无用,字符串应返回所有字符串部分,表达式rest参数具有所有表达式值。 只需通过将每个表达式放在2个字符串元素之间来重建订单

 const i = (strings, ...expressions) => { const list = []; for (let i = 0; i < strings.length; i++) { if (strings[i].trim() !== '') { list.push(strings[i].trim()) } if (i < expressions.length) { list.push(expressions[i]) } } let stack = []; let result = 0; do { const token = list.shift() if (token === '+') { result = stack.reduce(function(result, value) { return result + value }, result) stack.length = 0; } else if (token === '-') { result = stack.reduce(function(result, value) { return result - value }, result) stack.length = 0; } else { stack.push(token) } } while (list.length > 0); return result; } const a = 2, b = 1, c = 4, d = 3, e = 4; console.log("result", i `${a} ${b} ${c} ${d} + ${e} - `); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM