北大侠客行MUD论坛

 找回密码
 注册
搜索
热搜: 新手 wiki 升级
查看: 275|回复: 3

写现代JS还是比lua舒服

[复制链接]
发表于 2024-9-29 14:10:51 | 显示全部楼层 |阅读模式
写新机器框架,把hclua中的ring组件迁移到了js,实在是差距太大
lua代码:
  1. local M = {}

  2. M.Ring = {}
  3. M.Ring.__index = M.Ring

  4. function M.Ring:new()
  5.     local r = {
  6.         _next = nil,
  7.         _prev = nil,
  8.         _value = nil,
  9.     }
  10.     setmetatable(r, self)
  11.     return r
  12. end

  13. function M.Ring:_init()
  14.     self._next = self
  15.     self._prev = self
  16.     return self
  17. end

  18. function M.Ring:next()
  19.     if self._next == nil then
  20.         return self:_init()
  21.     end
  22.     return self._next
  23. end

  24. function M.Ring:prev()
  25.     if self._next == nil then
  26.         return self:_init()
  27.     end
  28.     return self._prev
  29. end

  30. function M.Ring:value()
  31.     return self._value
  32. end

  33. function M.Ring:withValue(v)
  34.     self._value = v
  35.     return self
  36. end

  37. function M.Ring:move(n)
  38.     if self._next == nil then
  39.         return self:_init()
  40.     end
  41.     local r = self
  42.     if n < 0 then
  43.         while n < 0 do
  44.             r = r:prev()
  45.             n = n + 1
  46.         end
  47.     elseif n > 0 then
  48.         while n > 0 do
  49.             r = r:next()
  50.             n = n - 1
  51.         end
  52.     end
  53.     return r
  54. end

  55. function M.Ring:link(r)
  56.     local n = self:next()
  57.     if (r ~= nil) then
  58.         local p = r:prev()
  59.         self._next = r
  60.         r._prev = self
  61.         n._prev = p
  62.         p._next = n
  63.     end
  64.     return n
  65. end

  66. function M.Ring:unlink(n)
  67.     if n <= 0 then
  68.         return nil
  69.     end
  70.     return self:link(self:move(n + 1))
  71. end

  72. function M.Ring:len()
  73.     local n = 0
  74.     if (self ~= nil) then
  75.         n = 1
  76.         local p = self:next()
  77.         while p ~= self do
  78.             n = n + 1
  79.             p = p:next()
  80.         end
  81.     end
  82.     return n
  83. end

  84. function M.Ring:apply(fn)
  85.     if (self ~= nil) then
  86.         fn(self:value())
  87.         local p = self:next()
  88.         while p ~= self do
  89.             fn(p:value())
  90.             p = p:next()
  91.         end
  92.     end
  93. end

  94. function M.new(n)
  95.     if (n <= 0) then
  96.         return nil
  97.     end
  98.     local r = M.Ring:new()
  99.     local p = r
  100.     local i = 1
  101.     while i < n do
  102.         local newp = M.Ring:new()
  103.         newp._prev = p
  104.         p._next = newp
  105.         p = newp
  106.         i = i + 1
  107.     end
  108.     p._next = r
  109.     r._prev = p
  110.     return r
  111. end

  112. return M
复制代码


js代码
  1. (function () {
  2.     class Ring {
  3.         constructor() {
  4.         }
  5.         #next = null
  6.         #prev = null
  7.         #value = null
  8.         #init() {
  9.             this.#next = this
  10.             this.#prev = this
  11.             return this
  12.         }
  13.         Next() {
  14.             if (this.#next == null) {
  15.                 return this.#init()
  16.             }
  17.             return this.#next
  18.         }
  19.         Prev() {
  20.             if (this.#next == null) {
  21.                 return this.#init()
  22.             }
  23.             return this.#prev
  24.         }
  25.         Value() {
  26.             return this.#value
  27.         }
  28.         WithValue(v) {
  29.             this.#value = v
  30.             return this
  31.         }
  32.         Move(n) {
  33.             if (this.#next == null) {
  34.                 return this.#init()
  35.             }
  36.             let r = this
  37.             if (n < 0) {
  38.                 while (n < 0) {
  39.                     r = r.Prev()
  40.                     n = n + 1
  41.                 }
  42.             } else if (n > 0) {
  43.                 while (n > 0) {
  44.                     r = r.Next()
  45.                     n = n - 1
  46.                 }
  47.             }
  48.             return r
  49.         }
  50.         Link(r) {
  51.             let n = this.Next()
  52.             if (r != null) {
  53.                 let p = r.Prev()
  54.                 this.#next = r
  55.                 r.#prev = this
  56.                 n.#prev = p
  57.                 p.#next = n
  58.             }
  59.             return n
  60.         }
  61.         Unlink(n) {
  62.             if (n <= 0) {
  63.                 return null
  64.             }
  65.             return this.Link(this.Move(n + 1))
  66.         }
  67.         Len() {
  68.             let n = 0
  69.             if (this != null) {
  70.                 n = 1
  71.                 let p = this.Next()
  72.                 while (p != this) {
  73.                     n = n + 1
  74.                     p = p.Next()
  75.                 }
  76.             }
  77.             return n
  78.         }
  79.         Apply(fn) {
  80.             if (this != null) {
  81.                 let p = this.Next()
  82.                 while (p != this) {
  83.                     fn(p.Value())
  84.                     p = p.Next()
  85.                 }
  86.             }
  87.         }
  88.         static New(n) {
  89.             if (n <= 0) {
  90.                 return null
  91.             }
  92.             let r = new Ring()
  93.             let p = r
  94.             let i = 1
  95.             while (i < n) {
  96.                 let newp = new Ring()
  97.                 newp.#prev = p
  98.                 p.#next = newp
  99.                 p = newp
  100.                 i = i + 1
  101.             }
  102.             p.#next = r
  103.             r.#prev = p
  104.             return r
  105.         }
  106.     }
  107.     return Ring
  108. })()
复制代码


js的真的赏心悦目多了。

最关键用起来也方便,不用考虑倒地是对象还是table,一个点全打通

  1. (function(app){
  2.     let ring=app.Include("helllibjs/lib/container/ring.js")
  3.     class History{
  4.         constructor(size){
  5.             this.Lines=ring.New(size)
  6.             this.Size=size
  7.         }
  8.         OnEvent(event){
  9.             if (event.Name=="line"){
  10.                 this.Current=event.Data.Output
  11.                 this.CurrentOutput=JSON.parse(DumpOutput(1))
  12.                 this.Lines=this.Lines.Next().WithValue({
  13.                     Line:this.Current,
  14.                     Output:this.CurrentOutput,
  15.                 })
  16.             }
  17.         }
  18.         GetLast(n){
  19.             let result=[]
  20.             if (n>this.Size){
  21.                 n=this.Size
  22.             }
  23.             let r=this.Lines
  24.             for (let i=0;i
  25.                 let v=r.Value()
  26.                 if (v!=null){
  27.                     result.unshift(v)
  28.                 }
  29.                 r=r.Prev()
  30.             }
  31.             return result
  32.         }
  33.         static Install(size){
  34.             app.History=new History(size)
  35.             app.Engine.BindEventHandler(function(event){
  36.                 app.History.OnEvent(event)
  37.             })
  38.         }
  39.         Size=0
  40.         Lines=null
  41.         Current=""
  42.         CurrentOutput=null
  43.     }
  44.     return History
  45. })
复制代码


虽然一直觉得JS不好用,但也要看对比。

星爷的唐伯虎点秋香诚不欺我。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2024-9-30 03:23:52 | 显示全部楼层
杰哥 你这是要重新开发mud客户端了吗
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2024-9-30 03:39:00 | 显示全部楼层
许愿杰哥设计
一款现在化的mud 客户端
基于electron 的一款跨平台GUI客户端,抛弃lua全部应用js技术栈.
函数命令封装要全面,
地图绘画简洁,调用地图简单,封装寻路遍历算法.
要做到不是程序员出身的新手小白也能上手使用;注重逻辑实现,轻算法.
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2024-9-30 08:53:27 | 显示全部楼层
cmfu 发表于 2024-9-30 03:39 AM
许愿杰哥设计
一款现在化的mud 客户端
基于electron 的一款跨平台GUI客户端,抛弃lua全部应用js技术栈.

我的客户端本身就是js/lua双持啊。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|北大侠客行MUD ( 京ICP备16065414号-1 )

GMT+8, 2024-11-1 09:29 AM , Processed in 0.012349 second(s), 14 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表