{"id":13932568,"url":"https://github.com/bajdcc/jMiniLang","last_synced_at":"2025-07-19T16:31:45.490Z","repository":{"id":29095351,"uuid":"32624604","full_name":"bajdcc/jMiniLang","owner":"bajdcc","description":"用Kotlin实现的编译器和虚拟机，并在此基础上构建操作系统。","archived":false,"fork":false,"pushed_at":"2019-01-06T14:22:01.000Z","size":7803,"stargazers_count":65,"open_issues_count":0,"forks_count":20,"subscribers_count":9,"default_branch":"master","last_synced_at":"2024-08-08T21:18:27.693Z","etag":null,"topics":["compiler","java","lambda","layui","multi-process","parser","spring-boot","thymeleaf","virtual-machine","vuejs"],"latest_commit_sha":null,"homepage":"http://files.cnblogs.com/files/bajdcc/jMiniLang-manual.pdf","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bajdcc.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-03-21T07:57:41.000Z","updated_at":"2024-06-15T07:59:04.000Z","dependencies_parsed_at":"2022-08-02T17:16:11.368Z","dependency_job_id":null,"html_url":"https://github.com/bajdcc/jMiniLang","commit_stats":null,"previous_names":[],"tags_count":19,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bajdcc%2FjMiniLang","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bajdcc%2FjMiniLang/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bajdcc%2FjMiniLang/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bajdcc%2FjMiniLang/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bajdcc","download_url":"https://codeload.github.com/bajdcc/jMiniLang/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":226643758,"owners_count":17662966,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["compiler","java","lambda","layui","multi-process","parser","spring-boot","thymeleaf","virtual-machine","vuejs"],"created_at":"2024-08-07T21:01:08.019Z","updated_at":"2024-11-26T23:30:37.648Z","avatar_url":"https://github.com/bajdcc.png","language":"Kotlin","readme":"# jMiniLang - GLR Compiler and Virtual Machine (*Kotlin*)\n\n[![Build status](https://ci.appveyor.com/api/projects/status/axmcy1gijdbw3rj9?svg=true)](https://ci.appveyor.com/project/bajdcc/jminilang)\n\n设计思路：https://zhuanlan.zhihu.com/p/28540783\n\n视频演示：https://www.bilibili.com/video/av13294962/\n\n[语法参考（LR状态转移表）](https://github.com/bajdcc/jMiniLang/blob/master/Grammar.md)\n\n*一言以蔽之，本项目涉及的思想包括：*\n\n- 编译原理（涵盖正则文法(com.bajdcc.util.lexer)、LR1文法(com.bajdcc.LALR1)、LL1文法(com.bajdcc.LL1)），重点：**语法制导翻译、自定义语义动作**，包含自动机的生成(非确定性有限自动机-NFA、确定性有限自动机-DFA、非确定性下推自动机-NPDA、确定性下推自动机-PDA)、LR或LL表的生成(com.bajdcc.LALR1/LL1.syntax)、语法分析(com.bajdcc.LALR1.grammar)、语义分析(com.bajdcc.LALR1.semantic)、语法树的生成(com.bajdcc.LALR1.grammar.tree)、中间代码的生成(com.bajdcc.LALR1.grammar.codegen)，其中LR分析部分要感谢vczh大牛提供的C++源码\n- 虚拟机(com.bajdcc.LALR1.interpret)，包含基于栈的虚拟机指令的设计(com.bajdcc.LALR1.grammar.runtime)（**没有指针，只有引用**）、外部方法导入、二进制码生成、隐性类型转换、实现N元运算\n- 语法特性(com.bajdcc.LALR1.grammar.Grammar)，包含foreach/yield的实现、Lambda的实现、管道的实现、import导入代码页的实现、实现try/catch，及一些语法糖\n- 操作系统，包含多进程的实现(RuntimeProcess)、微服务架构（`ModuleTask`）、基于管道的进程同步机制的实现（`ModuleProc`）、用户进程的实现（`ModuleUserBase`意思是可以挂掉而不影响系统）\n- Web网页服务器的实现(com.bajdcc.web)，包含REST接口的实现、REST服务与jMiniLang用户进程的消息传递机制、Spring-boot的使用\n- UI(com.bajdcc.LALR1.ui)，包含部分SVG指令的绘制、操作系统层面的UI服务设计、控制台的实现、Ctrl-C指令的实现、对话框Dialog的实现、支持中文宽字符的显示、支持RGB24位彩色字符的显示、支持背景颜色的设置\n- 基于jMiniLang语言实现的面向对象特性（`ModuleClass`参照JS的原型链）\n- 函数式编程接口的实现（`ModuleFunction`）\n- LISP的jMiniLang实现（`ModuleLisp`），[B站视频链接](https://www.bilibili.com/video/av13294962/?p=2)\n- 语言集成查询（LINQ）的jMiniLang实现（`ModuleStdBase`，参考Vlpp），类似Java 8 Stream链式/流式操作\n\n*一言以蔽之，本项目涉及的玩法包括：*\n\n- Spring-boot与layui制作的管理后台，包括资源查看、文档查看、**在线编译**！\n- `UserService` RING3级用户服务，实现**FORK**、**管道**、**互斥**。\n- **开发中** 【C语言解释器】类似[CParser](https://github.com/bajdcc/CParser)的类设计，参考GO语言库，[代码](https://github.com/bajdcc/jMiniLang/blob/master/src/main/resources/com/bajdcc/code/module/user/ModuleUserCParser.txt)\n- Shell层面的管道机制，类似`echo a | \u003e b.txt`等，语法层面有Bash接口的实现\n- 基于Map数据的原型链实现面向对象特性（`ModuleClass`），应用有：状态机实例--百度新闻（URNews）、行为树实例-AI（URAI）、状态机实例-歌词动画（URMusic）、图论-路由距离算法-PC（URPC）\n- BadApple黑白动画播放（`test badapple`），测试IO性能\n- SSH机制（`ModuleNet`），采用netty实现远程命令\n- Spring-boot制作而成的网页服务器(localhost:8080)，与我们的jMiniLang语言进行交互，可以查看jMiniLang虚拟机的各项指标\n- 哲学家进餐问题（`test philo`、`test philo2`）\n- LISP的实现（`test lisp`）\n- LINQ的实现（`test linq`）\n- 一个自制的基于NIO的简易HTTP服务器（`test web`）\n- *还有一些其他的好玩的但不想费力介绍的冷门内容，上面的部分内容我懒得截图了*\n\n----\n\n***jMiniLang*** is a simplified compiler/vm framework. Developed by ***bajdcc***.\n*PS.* ***LR Analysis*** refers to ***VFS*** developed by [*vczh*](https://github.com/vczh \"Github page of vczh\").\n\n本项目是一个LR编译器、虚拟机一体化工程，并且对虚拟机进行了拓展，参考了操作系统设计的思想。\n\n#### Features（特性）\n\n1. 词法分析阶段。Lexer which generates *NFA* and *DFA*.\n2. 语法分析、词法分析、制导翻译。Parser which implements *LALR(1) Grammar* with optional semantic action.\n3. 语义分析。Customized semantic analysis.\n4. 可打印语法树。Printable syntax tree.\n5. 基于栈的自定义指令集。Stack-based instruction design.\n6. Kotlin本地方法导入。Native method.\n7. 代码页导入/导出。Import and export of code page.\n8. 代码页序列化。Serializable code page.\n9. 匿名函数及闭包。**Lambda functions and Closure**.\n10. 语法/词法错误提示。Display grammar and semantic errors.\n11. 管道机制。**Pipe**.\n12. 多进程机制。**Multiple process**.\n13. 同步/异步执行代码。Load file with Sync/Async.\n14. 虚拟机。**Virtual machine**.\n15. 支持彩色界面。**Support Colorful GUI**.\n16. 函数式编程。**Functional programming**.\n17. **LISP**.\n18. 网络流。**Socket stream**.\n19. 虚拟文件系统。Save/Load file or VFS.\n20. 基于原型的类设计。**Class prototype**.\n21. **Bash Interface**.\n22. 数组/词典初始化。Array/Map initialize list.\n23. 异常机制。**Try/Catch/Throw**.\n24. 行为树。**Behavior Tree**, including PC network simulator.\n25. 用户级进程。**RING 3 Process**, including User Service, `fork`.\n26. 网页服务器。**Web Server**, including Online Compiler and Runner.\n27. C语言解析。**CParser** class on `ModuleUser`.\n\n#### What it generates（产生）\n\n- 正则表达式、状态机。Structures of *Regex*, *NFA* and *DFA* Table.\n- 分析表。Structures of *LL*/*LR* Table.\n- 语义分析指令。Structures of semantic instructions.\n- 语法树。Structures of syntax tree.\n- 代码页。Structures of code page.\n- 虚拟机指令。Virtual machine instructions.\n- 运行时环境。Runtime environment.\n\n#### Virtual Machine OS\n\nAn OS running on *jMiniLang* compiler and interpreter.\n\nNow has commands:（现在主窗口支持的cmd命令）\n\n- echo\n- dup\n- pipe\n- grep\n- proc\n- range\n- task\n- sleep\n- time\n- count\n- **msg**\n- **news**(refer: https://github.com/bajdcc/NewsApp)\n- **bash**\n- replace\n- util\n- **ai**\n- **pc**\n- **music**\n\nTasks:（使用方法如：`@system halt`）\n\n- System\n- Utility\n- Remote\n- UI\n- Store\n- Proc\n\nUI:（使用方法如：`@ui on clock`）\n\n- Clock\n- Hitokoto\n- Monitor\n\nToggle UI:\n\n- `task ui on/off clock`\n- `task ui on/off hitokoto`\n- `task ui on/off monitor`\n\nImplemented IPC, usage:（微服务）\n\n- `task system now` -\u003e Get system time\n- `task util calc 1+2*3` -\u003e Val = 7\n- `task ui print hello world` -\u003e Remote window\n- `task ui path M 100 100 L 200 200` -\u003e SVG\n\nUtility:\n\n- `task util doc g_func_fold` -\u003e Document\n- `task util reverse ...`\n- `task util toupper ...`\n- `task util sum ...`\n- `task util product ...`\n- `task util palindrome ...`\n\nTests:（测试命令，直接在主窗口cmd输入，Ctrl-C中止）\n\n- `test philo/philo2`: Multi-processing and synchronization\n- `test lisp`: [LISP language](https://zhuanlan.zhihu.com/p/29243574)\n- `test font`: Support Chinese Language(wide font)\n- `test fork`: Test fork\n- `test class`: Test AOP and Prototype for class\n- `test bash`: Test bash interface\n- `test try`: Test try/catch\n- `test badapple`: Test ascii output, code in [BadApple](https://github.com/bajdcc/tinix/blob/master/user/app/badapple.c)\n- `test dialog`: Test **JOptionPane.showXXXDialog**\n- `test linq`: Test LINQ\n- `test proc`: Test Ring 3 API\n- `test proc2`: Test Ring 3 code with input\n- `test web`: HTTP Web Server\n\nImplemented MSG, usage:（远程控制）\n\n- Create server: `msg server PORT | filter pipe`\n- Create client: `other pipe | msg connect IP:PORT`\n\nPC command:\n\n- `pc add A 10 10 100 100`\n- `pc remove A`\n- `pc msg A B`\n\nLINQ:\n\n- `from(list)` or `from(array)`\n- `range(begin, end)`\n- Function: select, where, first, last, max, sum, for_each, group_by, distinct, union, etc.\n\nTASK PROC:\n\n- exec：执行代码\n- exec_file：读文件执行代码\n- kill：中止用户进程\n- info：取得用户进程状态（用于浏览器远程回调）\n\n[USER HANDLE](https://github.com/bajdcc/jMiniLang/blob/master/src/main/kotlin/com/bajdcc/LALR1/grammar/runtime/service/IRuntimeUserService.kt):（用户级进程支持的句柄种类）\n\n- pipe：管道，类似Go中的chan，用于跨进程同步，读阻塞，写不阻塞。\n- share：共享，同步跨进程数据共享。\n- file：文件，虚拟文件接口，同步操作。\n- window：窗口，创建JFrame窗口，异步，包括绘制、消息。\n- net：网络，包括HTTP请求，OkHttp实现，异步。\n\nDependencies:（使用的开源库，下面为部分）\n\n- JSON格式化：fastjson\n- 实现远程命令SSH：netty\n- 后端及API：spring-boot\n- 网页模版：thymeleaf\n- 前端交互：vue\n- 前端样式：layui\n- Markdown文档转换：flexmark\n- 数据结构：guava\n- HTTP请求：okhttp\n- JAR打包：shadow\n\n#### Manual\n\n[*Simplified Chinese Version*](https://raw.githubusercontent.com/bajdcc/jMiniLang/master/%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E.pdf \"Manual - Simplified Chinese\")\n\n#### Example\n\n**Web Server**\n\n1. **Spring Boot API**, port 8080\n2. **Java NIO**, port 8088\n3. Render Markdown using FlexMark\n\n*Front-end: LayUI（前端）*\n\n**1. Spring Boot API**\n\n\u003e Front-end: LayUI + Vue.js\n\u003e\n\u003e API: Json + RestController\n\u003e\n\u003e Back-end: jMiniLang API Handler (RING 3 Process)\n\n**Run on Server**\n\n** Online Compiler Example V: GUI User Window **\n\n![Screenshot GUI-1](https://raw.githubusercontent.com/bajdcc/jMiniLang/master/screenshots/gui-1.png)\n\n[window.txt](https://github.com/bajdcc/jMiniLang/blob/master/src/main/resources/com/bajdcc/code/fs/window.txt)\n\n```\nimport \"user.base\";\nvar w = g_window(\"test window\");\nvar width = 800;\nvar height = 600;\nvar border = 10;\nw.\"msg\"(0, width, height); // CREATE\nw.\"svg\"('M', border, border);\nw.\"svg\"('L', width - border, border);\nw.\"svg\"('L', width - border, height - border);\nw.\"svg\"('L', border, height - border);\nw.\"svg\"('L', border, border);\nw.\"svg\"('M', border * 2, border * 2);\nw.\"svg\"('S', width - border * 4, height - border * 4);\nw.\"str\"(1, g_string_rep(\"Hello world! \", 20));\nw.\"svg\"('m', 0, 200);\nw.\"str\"(1, g_string_rep(\"Hello world! \", 20));\nw.\"svg\"('m', 0, 200);\nw.\"str\"(0, g_string_rep(\"Hello world! \", 20));\ng_sleep_s(1);\nw.\"msg\"(2, 0, 0); // WAIT FOR CLOSE\n```\n\n** Online Compiler Example IV: Mutex **\n\n```javascript\nimport \"user.base\";\n\nvar channel = g_pipe(\"TEST-MUTEX\");\nvar goods = g_share(\"TEST-MUTEX#GOOD\", g_from([]));\nvar index = g_share(\"TEST-MUTEX#INDEX\", 0);\ng_create_dir(\"/example-mutex\");\n\nvar new_id = func ~() -\u003e index.\"set!\"(lambda(a) -\u003e a++);\nvar enqueue = func ~(id) -\u003e goods.\"get!\"(lambda(a) -\u003e a.\"push\"(id));\nvar dequeue = func ~() -\u003e goods.\"get!\"(lambda(a) -\u003e a.\"pop\"());\n\nvar consumer_id = func ~(id) -\u003e \"/example-mutex/consumer-\" + id;\nvar producer_id = func ~(id) -\u003e \"/example-mutex/producer-\" + id;\n\nvar consumer = func ~(id) {\n    var obj;\n    var now = g_get_timestamp();\n    channel.\"writeln\"(\"消费者 #\" + id + \" 已启动\");\n    foreach (var i : g_range(1, 5)) {\n        while (g_is_null(obj := dequeue())) {}\n        channel.\"writeln\"(\"消费者 #\" + id + \" 收到：\" + obj);\n    }\n    channel.\"writeln\"(\"消费者 #\" + id + \" 已退出\");\n    var span = g_get_timestamp() - now;\n    g_write_file(consumer_id(id), \"消费者 #\" + id + \" 用时 \" + span + \"ms\", true, true);\n};\n\nvar producer = func ~(id) {\n    var obj;\n    var now = g_get_timestamp();\n    channel.\"writeln\"(\"生产者 #\" + id + \" 已启动\");\n    foreach (var i : g_range(1, 5)) {\n        enqueue(obj := new_id());\n        channel.\"writeln\"(\"生产者 #\" + id + \" 发送：\" + obj);\n    }\n    channel.\"writeln\"(\"生产者 #\" + id + \" 已退出\");\n    var span = g_get_timestamp() - now;\n    g_write_file(producer_id(id), \"生产者 #\" + id + \" 用时 \" + span + \"ms\", true, true);\n};\n\nvar child = false;\n\nforeach (var i : g_range(1, 5)) {\n    if (g_fork() == -1) {\n        consumer(i);\n        child := true;\n        break;\n    }\n    if (g_fork() == -1) {\n        producer(i);\n        child := true;\n        break;\n    }\n}\n\nif (child) { return; }\n\nif (g_fork() == -1) {\n    var i = 0;\n    while (i \u003c 10) {\n        foreach (var id : g_range(1, 5)) {\n            if (g_query_file(consumer_id(id)) == 1) {\n                i++;\n                channel.\"writeln\"(g_read_file(consumer_id(id)));\n                g_delete_file(consumer_id(id));\n            }\n            if (g_query_file(producer_id(id)) == 1) {\n                i++;\n                channel.\"writeln\"(g_read_file(producer_id(id)));\n                g_delete_file(producer_id(id));\n            }\n        }\n    }\n    channel.\"write\"(g_noop_true);\n    g_delete_file(\"/example-mutex\");\n    return;\n}\n\nchannel.\"pipe\"(g_system_output());\n```\n\n**Output:**\n\n```\n运行成功！PID：24\n消费者 #1 已启动\n生产者 #1 已启动\n消费者 #2 已启动\n生产者 #2 已启动\n消费者 #3 已启动\n生产者 #3 已启动\n消费者 #4 已启动\n生产者 #4 已启动\n消费者 #5 已启动\n生产者 #5 已启动\n生产者 #1 发送：1\n消费者 #2 收到：1\n生产者 #2 发送：2\n消费者 #3 收到：2\n生产者 #3 发送：3\n...\n消费者 #3 已退出\n生产者 #4 发送：19\n消费者 #4 收到：19\n消费者 #4 已退出\n生产者 #5 发送：20\n消费者 #5 收到：20\n消费者 #5 已退出\n生产者 #1 发送：21\n生产者 #1 已退出\n消费者 #1 收到：21\n消费者 #1 已退出\n生产者 #2 发送：22\n生产者 #2 已退出\n生产者 #3 发送：23\n生产者 #3 已退出\n生产者 #4 发送：24\n生产者 #4 已退出\n生产者 #5 发送：25\n生产者 #5 已退出\n消费者 #2 收到：22\n消费者 #2 收到：23\n消费者 #2 收到：24\n消费者 #2 收到：25\n消费者 #2 已退出\n生产者 #1 用时 106ms\n消费者 #2 用时 131ms\n生产者 #2 用时 107ms\n消费者 #3 用时 91ms\n生产者 #3 用时 104ms\n消费者 #4 用时 88ms\n生产者 #4 用时 101ms\n消费者 #5 用时 89ms\n生产者 #5 用时 100ms\n消费者 #1 用时 108ms\n\n正常退出\n```\n\n** Online Compiler Example III: Fork **\n\n*`Fork` support `yield`*\n\n```javascript\nimport \"user.base\";\n\nvar channel = g_pipe(\"TEST-FORK\");\n\nvar pid = g_null;\nif ((pid := g_fork()) != -1) { // 父进程读取管道\n    g_puts(\"父进程 PID：\" + g_pid());\n    g_puts(\"父进程 FORK 返回：\" + pid);\n    g_puts(channel, \"读取管道：\");\n    channel.\"pipe\"(g_system_output());\n} else { // 子进程写入管道\n    channel.\"writeln\"(\"子进程 FORK 返回：\" + pid);\n    var range = yield ~() { // 枚举器\n        for (var i = 0; i \u003c 3; i++) {\n            yield g_fork(); // 枚举返回值\n        }\n    };\n    foreach (var i : range()) {\n        var txt = \"这是一条测试消息！ PID：\" + g_pid() + \" 编号：\" + i;\n        channel.\"writeln\"(txt);//写管道\n        g_sleep_s(1);\n    }\n    channel.\"write\"(g_noop_true);//发送管道关闭信号\n}\n\n```\n\n**Output:**\n\n```\n运行成功！PID：24\n父进程 PID：24\n父进程 FORK 返回：25\nclass= system::pipe 字符串(system::pipe)\n读取管道：\n子进程 FORK 返回：-1\n这是一条测试消息！ PID：25 编号：26\n这是一条测试消息！ PID：26 编号：-1\n这是一条测试消息！ PID：32 编号：-1\n这是一条测试消息！ PID：33 编号：-1\n这是一条测试消息！ PID：25 编号：32\n这是一条测试消息！ PID：26 编号：33\n这是一条测试消息！ PID：32 编号：38\n这是一条测试消息！ PID：33 编号：39\n这是一条测试消息！ PID：38 编号：-1\n这是一条测试消息！ PID：39 编号：-1\n这是一条测试消息！ PID：40 编号：-1\n这是一条测试消息！ PID：41 编号：-1\n这是一条测试消息！ PID：25 编号：40\n这是一条测试消息！ PID：26 编号：41\n\n正常退出\n```\n\n** Online Compiler Example II: Pipe **\n\n**Reader**\n\n```javascript\nimport \"user.base\";\n\nvar channel = g_pipe(\"TEST\");\ng_puts(channel, \"读取管道：\");\nchannel.\"pipe\"(g_system_output());//将管道重定向至输出流\n```\n\n**Writer**\n\n```javascript\nimport \"user.base\";\n\nvar channel = g_pipe(\"TEST\");\ng_puts(channel, \"写入管道：\");\nfor (var i = 0; i \u003c 10; i++) {\n    var txt = \"这是一条测试消息！ 编号：\" + i;\n    channel.\"write\"(txt + g_endl);//写管道\n    g_puts(txt);\n    g_sleep_s(1);\n}\ng_puts();\nchannel.\"write\"(g_noop_true);//发送管道关闭信号\n```\n\n![Screenshot 108](https://raw.githubusercontent.com/bajdcc/jMiniLang/master/screenshots/web-8.gif)\n\n----\n\n![Screenshot 107](https://raw.githubusercontent.com/bajdcc/jMiniLang/master/screenshots/web-7.gif)\n\n![Screenshot 106](https://raw.githubusercontent.com/bajdcc/jMiniLang/master/screenshots/web-6.png)\n\n![Screenshot 107](https://raw.githubusercontent.com/bajdcc/jMiniLang/master/screenshots/web-7.gif)\n\n** Online Compiler Example I: Hanoi **\n\n[hanoi.txt](https://github.com/bajdcc/jMiniLang/blob/master/src/main/resources/com/bajdcc/code/fs/example/hanoi.txt)\n\n```javascript\nimport \"user.base\";\nvar move = func ~(i, x, y) -\u003e\n    g_puts(g_to_string(i) + \": \" + g_to_string(x) + \" -\u003e \" + g_to_string(y));\nvar h = call (func ~(f) -\u003e\n    call (func [\n    \"实现Y Combinator\",\n    \"Y = f -\u003e (x -\u003e f x x) (x -\u003e f x x)\",\n    \"相关网页——https://www.cnblogs.com/bajdcc/p/5757410.html\"\n    ] ~(h) -\u003e h(h))(\n        lambda(x) -\u003e lambda(i, a, b, c) -\u003e\n            call (f(x(x)))(i, a, b, c)))\n(lambda(f) -\u003e lambda(i, a, b, c) {\n    if (i == 1) {\n        move(i, a, c);\n    } else {\n        f(i - 1, a, c, b);\n        move(i, a, c);\n        f(i - 1, b, a, c);\n    }\n});\nh(3, 'A', 'B', 'C');\n```\n\n**Online Documentation**\n\n![Screenshot 105](https://raw.githubusercontent.com/bajdcc/jMiniLang/master/screenshots/web-5.png)\n\n![Screenshot 102](https://raw.githubusercontent.com/bajdcc/jMiniLang/master/screenshots/web-4.png)\n\n![Screenshot 103](https://raw.githubusercontent.com/bajdcc/jMiniLang/master/screenshots/web-3.gif)\n\n**Back-end**\n\n[api.txt](https://github.com/bajdcc/jMiniLang/blob/master/src/main/resources/com/bajdcc/code/fs/api.txt)\n\n----\n\n**2. Java NIO**\n\n[URTest.txt](https://github.com/bajdcc/jMiniLang/blob/master/src/main/resources/com/bajdcc/code/os/user/routine/URTest.txt#L1037)\n\n![Screenshot 101](https://raw.githubusercontent.com/bajdcc/jMiniLang/master/screenshots/web-1.png)\n\n**User mode**\n![Screenshot 100](https://raw.githubusercontent.com/bajdcc/jMiniLang/master/screenshots/usermode-1.gif)\n\n**LINQ Example**\n\n[URTest.txt](https://github.com/bajdcc/jMiniLang/blob/master/src/main/resources/com/bajdcc/code/os/user/routine/URTest.txt#L899)\n\n**Bash Example**\n\n[URTest.txt](https://github.com/bajdcc/jMiniLang/blob/master/src/main/resources/com/bajdcc/code/os/user/routine/URTest.txt#L724)\n\n**Tail optimization （尾递归优化）**\n\n```javascript\nvar g_tail_opt = func [\"尾递归优化\"] ~(fun, args) {\n    var x = lambda(a) { throw a; };\n    var fact = fun(x);\n    for (;;) {\n        try {\n            return g_call_apply(fact, args);\n        } catch (e) {\n            args := e;\n        }\n    }\n};\n\n// Usage\ng_printn(\"Factorial(10) = \" + g_tail_opt(\n    lambda(f) -\u003e lambda(n, total) -\u003e n \u003c= 1 ? total : f([n - 1, total * n]),\n    [10, 1]));\ng_printn(\"Fibonacci(10) = \" + g_tail_opt(\n    lambda(f) -\u003e lambda(n, a, total) -\u003e n \u003c= 1 ? total : f([n - 1, total, a + total]),\n    [10, 0, 1]));\n```\n\n**0. Class （Omitted 省略）**\n\n[URTest.txt](https://github.com/bajdcc/jMiniLang/blob/master/src/main/resources/com/bajdcc/code/os/user/routine/URTest.txt#L578)\n\n**1. Lambda: Y Combinator of Hanoi （见上面的例子）**\n\nHidden, see *Online Compiler Example I: Hanoi* above. \n\n**2. Lambda: Trampoline （Omitted 省略）**\n\n**3. List: LinkedList （Omitted 省略）**\n\n**4. Multi-Process: Pipe （Omitted 省略）**\n\n**5. Multi-Process: Consumer-Producer Model （生产者-消费者模型）**\n\n*See online compiler example above. 见上面的例子。*\n\n**6. Multi-Process: PC and Router （多进程，Omitted 省略）**\n\n**7. Functional programming （函数式编程）**\n\n[ModuleFunction.txt](https://github.com/bajdcc/jMiniLang/blob/master/src/main/resources/com/bajdcc/code/module/ModuleFunction.txt)\n\n**以上省略的内容可见此README的历史版本。**\n\n#### Screenshot\n\n*Screenshot 1 - Code*\n![Screenshot 1](https://raw.githubusercontent.com/bajdcc/jMiniLang/master/screenshots/jMiniLang_1.png)\n\n*Screenshot 2 - Results*\n![Screenshot 2](https://raw.githubusercontent.com/bajdcc/jMiniLang/master/screenshots/jMiniLang_2.png)\n\n*Screenshot 3 - Y-Combinator*\n![Screenshot 3](https://raw.githubusercontent.com/bajdcc/jMiniLang/master/screenshots/jMiniLang_3.png)\n\n*Screenshot 4 - OS Virtual Machine with GUI*\n![Screenshot 4](https://raw.githubusercontent.com/bajdcc/jMiniLang/master/screenshots/jMiniLang_4.png)\n\n*Screenshot 5 - Remote window*\n![Screenshot 5](https://raw.githubusercontent.com/bajdcc/jMiniLang/master/screenshots/zhihu-1.png)\n\n*Screenshot 6 - Functional programming*\n![Screenshot 6](https://raw.githubusercontent.com/bajdcc/jMiniLang/master/screenshots/zhihu-2.png)\n\n*Screenshot 7 - 哲学家就餐*\n\n专栏：https://zhuanlan.zhihu.com/p/29008180\n\n![Screenshot 7](https://raw.githubusercontent.com/bajdcc/jMiniLang/master/screenshots/zhihu-3.png)\n\n*Screenshot 8 - LISP*\n\n专栏：https://zhuanlan.zhihu.com/p/29243574\n\n![Screenshot 8](https://raw.githubusercontent.com/bajdcc/jMiniLang/master/screenshots/zhihu-4.png)\n\n*Screenshot 9 - 网络流*\n\n专栏：https://zhuanlan.zhihu.com/p/32692408\n\n![Screenshot 9](https://raw.githubusercontent.com/bajdcc/jMiniLang/master/screenshots/zhihu-5.jpg)","funding_links":[],"categories":["Kotlin"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbajdcc%2FjMiniLang","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbajdcc%2FjMiniLang","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbajdcc%2FjMiniLang/lists"}