Porting duff's设备从C语言转换为JavaScript

Porting duff's device from C to JavaScript

本文关键字:语言 转换 JavaScript duff Porting      更新时间:2023-09-26

我在C中有这种Duff的设备,它运行良好(将文本格式化为货币):

#include <stdio.h>
#include <string.h>
char *money(const char *src, char *dst)
{
    const char *p = src;
    char *q = dst;
    size_t len;
    len = strlen(src);
    switch (len % 3) {
        do {
            *q++ = ',';
            case 0: *q++ = *p++;
            case 2: *q++ = *p++;
            case 1: *q++ = *p++;
        } while (*p);
    }
    *q++ = 0;
    return dst;
}
int main(void)
{
    char str[] = "1234567890123";
    char res[32];
    printf("%s'n", money(str, res));
    return 0;
}

输出:

1,234,567,890,123

但我在尝试在Javascript中实现相同功能时遇到了问题:

function money(src, dst) {
    var len = src.length;
    var i = 0;
    switch (len % 3) {
        do {
            dst += ',';
            case 0: dst += src[i++];
            case 2: dst += src[i++];
            case 1: dst += src[i++];
        } while (src[i]);
    }
    return dst;
}
var str = "1234567890123";
var res = "";
console.log(money(str, res));

nodejs返回此错误:

        do {
        ^^
SyntaxError: Unexpected token do

我的问题是:javascript支持计算GOTO语句吗?

第页。D: 我不想有其他选择,我只想知道为什么不起作用。

相关问题:达夫的设备在其他语言中工作吗?

我的问题是:javascript支持计算GOTO语句吗?

不是真的。

第页。D: 我不想有其他选择,我只想知道为什么不起作用。

它不起作用,因为在JavaScript中,switch语句必须只包含case块。

尽管可能没有寻找解决方案,但其他人在寻找解决方案时可能会发现这个问题,所以我无论如何都会提供一个
这要归功于mniper,他在asm.js.上提出了这个建议

其基本思想是在顶层有一个while(true)循环,其中有一条switch语句

goto:
while(true)
{
    switch(where)
    {
        // no breaks
        case 0:
            // some code...
        case 1:
            // some other code...
        // ...
    }
}

为了模拟goto,可以使用

where = 1;
continue goto;

然而,为了模拟duff的设备,只需要将循环作为外部结构,并在switch语句中使用一个变量,该变量在第一次迭代后被设置为一个值,该值将触发switch语句在其第一种情况下开始。

因此,在您的情况下,这意味着交换switchdo...while(),并添加一个default情况和一个控制变量:

var where = len % 3;
do {
    switch (where) {
        default: dst += ',';
        case 0:  dst += src[i++];
        case 2:  dst += src[i++];
        case 1:  dst += src[i++];
    }
    where = -1;
} while (src[i]);

通常,这种方法的一个巨大缺点是,它不能在回调中工作,回调在JavaScript中几乎无处不在
不过,只要它是在一个单一的、连续的上下文中使用的,它就应该起作用。

有关更多信息,请参阅asm.js repo上发布的票证。

JavaScript switch语句不能这样工作。

switch (expr) {
  case expr:
    statements;
    break;
  case expr:
    statements;
    break;
  default:
    statements;
    break;
}

但JavaScript确实提供了标签来控制你的循环

MDN 示例

var itemsPassed = 0;
var i, j;
top:
for (i = 0; i < items.length; i++){
  for (j = 0; j < tests.length; j++) {
    if (!tests[j].pass(items[i])) {
      continue top;
    }
  }
  itemsPassed++;
}

MDN 的另一个例子

var allPass = true;
var i, j;
top:
for (i = 0; items.length; i++)
  for (j = 0; j < tests.length; i++)
    if (!tests[j].pass(items[i])){
      allPass = false;
      break top;
    }