将 duff 的设备从 C 移植到 JavaScript

2023-12-25

我有这种 Duff 的 C 语言设备,它工作正常(将文本格式设置为金钱):

#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;
}

Output:

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));

Node.js 返回此错误:

        do {
        ^^
SyntaxError: Unexpected token do

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

P.D:我不需要替代方案,我只是想知道为什么不起作用。

相关问题:达夫的设备有其他语言版本吗? https://stackoverflow.com/q/817540/1606345


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

Not really.

P.D:我不需要替代方案,我只是想知道为什么不起作用。

它不起作用,因为在 JavaScript 中,switch语句必须仅包含case blocks http://www.ecma-international.org/ecma-262/6.0/#sec-switch-statement.

虽然you可能不是在寻找解决方法,其他人可能会在寻找问题时发现这个问题,所以无论如何我都会提供一个。
这归功于mnieper https://github.com/mnieper谁建议的asm.js https://github.com/dherman/asm.js/issues/80.

基本思想是有一个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 语句从第一个开始案件。

所以就你而言,这意味着交换switch and do...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 存储库上 https://github.com/dherman/asm.js/issues/80.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 duff 的设备从 C 移植到 JavaScript 的相关文章

随机推荐

  • 使用默认的其他模板参数推导第一个模板参数

    Gcc 和 clang 似乎在这段代码是否应该编译的问题上存在分歧 include
  • Log4J动态创建日志文件

    我已在每个进程运行时成功创建了日志 我现在遇到的问题是 任何被调用的不是当前正在运行的进程的子进程的包都不会将其日志写入我的文件 例如 我创建一个名为 running log 的新日志文件 正在运行的进程是 com me foo 该类内部调
  • 如何从数据库中按类别显示数据?

    因此 我的网站允许用户创建联系人列表 现在我添加了用户命名的类别 我当前正在使用从 SQL 查询生成的关联数组的 while 循环来显示联系人列表 所以它看起来像这样 Contacts Contact 1 Contact 2 Contact
  • 错误:此类与关键项目ToolBar 的键值编码不兼容? [复制]

    这个问题在这里已经有答案了 嘿 我无法弄清楚我遇到的错误 我的应用程序正在运行 然后我不确定我做了什么 但它现在无法打开 而是收到此错误 Terminating app due to uncaught exception NSUnknown
  • 无法在 Docker-Driver Windows 10 上访问 Minikube(v1.18.1) Ingress

    我的问题与this https stackoverflow com questions 66275458 could not access kubernetes ingress in browser on windows home with
  • 使用 PHP(或其他语言)流式传输数据(例如音乐)

    多年来 我一直在研究如何从我的计算机创建音乐流 我见过一些程序 但我见过的任何有用的东西都仅限于 Windows 我使用 Mac 最终 我产生了兴趣how流工作 有什么办法可以创建我的own流 可能使用套接字函数PHP 有没有PHP图书馆为
  • 如何在nhibernate中使用PK删除对象?

    如何删除对象而不先从数据库中获取它 在另一个 ORM 中 我可以这样做 session Delete
  • mojolicious 引用的存储变量并不总是定义的

    我仍在学习 mojolicious 和 MVC 框架 所以这可能是一个问题 我认为这个问题是错误的 所以如果我愿意 请建议一种更好的方法来执行以下操作 我有一条路线 route param 其中 param 有时被定义 有时则没有 我尝试在
  • 为什么“--force-recreate”不重建我的 docker mysql 映像?

    我创建了一个 docker MySql 5 7 映像 然后想更改几个名称 我的 docker compose yml 文件最终像这样 version 3 3 services db image mysql 5 7 restart alway
  • 未找到 osx sys/io.h

    我想在 os x 下使用 cc 编译为 linux 开发的 c 程序 它包括标头 sys io h 编译的时候报错说找不到这个文件 os x下不是有sys io h头文件吗 任何帮助将非常感激 Thanks Include
  • 更改flutter应用程序图标的背景颜色

    我想将背景图标更改为 fe6017 I use flutter launcher icons set adaptive icon background fe6017 但这不起作用 我也尝试调整图像大小 但它总是收缩并放置white我的图像周
  • 如何使用JW Player播放rtmp流?

    我想知道如何使用 JW Player 流式传输 RTMP 我刚刚开始 嵌入没有帮助 因此如果有人可以分享适合他的代码 将会有所帮助 我们这里有一个指南 http www longtailvideo com support jw player
  • jqgrid 获取所有网格列名称

    有没有办法获取网格的所有列名称 您可以使用以下方式获取列名称 var columnNames list 0 p colNames or var columnNames list jqGrid getGridParam colNames 唯一
  • 给定日期范围内的每日活跃用户数

    我需要根据开始日期和结束日期查找每日活跃用户总数 报名表 id registration no start date end date 1 1000 2014 12 01 2014 12 03 2 1001 2014 12 01 2014
  • PHP 中的“贪婪标记解析”是什么?

    PHP 中的 贪婪标记解析 是什么 我在 Codeigniter 指南中找到了这一点 除非需要解析变量 否则始终使用单引号字符串 并且在确实需要解析变量的情况下 请使用大括号来防止贪婪标记解析 我的字符串 foo 带有良好解释的答案会有所帮
  • React 和 babel 中的可选链接运算符

    在我的项目中我配置 babel presets react es2015 stage 1 transform optional chaining plugins transform runtime 这是我的devDependencies i
  • 如何一次运行多种语言的 tesseract?

    我必须分析包含英语和日语文本的图像 当我默认运行 tesseract 时 l eng 一些日语字符丢失了 否则 如果我用日语运行 tesseract l jpn 一些英文字符丢失 例如电子邮件 如何运行一个同时识别英语和日语字符的进程 从
  • dlopen 与链接开销

    假设我有一个库 foo so 当构建我的二进制文件 需要这个库 时 我可以 1 链接 foo so 或者 2 在程序源代码中 dlopen 这个库 然后调用这个库提供的函数 当我从库中调用函数时 1 和 2 之间有性能差异吗 请注意 我知道
  • 为什么 VB 中的 lambda 表达式与 C# 中不同?

    我刚刚在 NHibernate 中遇到了一个错误 该错误恰好已经被提出 https nhibernate jira com browse NH 2763 https nhibernate jira com browse NH 2763 我不
  • 将 duff 的设备从 C 移植到 JavaScript

    我有这种 Duff 的 C 语言设备 它工作正常 将文本格式设置为金钱 include