志之所趋,无远弗届---记录下老程序员的业余开发

楼主:中年大叔甲 时间:2022-10-01 23:03:25 北京 点击:4368 回复:61
脱水 打赏 看楼主 设置

字体:

边距:

背景:

还原:

  二十年来漫飘零,嗟余半生似浮萍。梦幻破处观灿烂,繁华落尽存芜菁。
  开这个帖子主要用来记录我的正在进行中的业余开发项目“Magic”的后续开发历程,可自勉,亦可寻觅知音。我相对比较懒散,业余开发嘛,其实也没什么明确的计划,主要就是有时间且有心情的话就敲几行代码,所以进度还处于早期。Magic是我给我的项目起的名字,它是一个我预想的表达式引擎,未来会开源。

打赏

5 点赞

主帖获得的天涯分:0
举报 | 楼主 | 埋红包
楼主发言:43次 发图:32张 | 添加到话题 |
楼主中年大叔甲 时间:2022-10-02 09:39:04 北京
  表达式引擎最基本的能力就是数值四则运算能力:

  
  

  图里的树形就是把表达式解析成树状结构,解释执行就是直接基于这颗树进行的,这里打印出来是因为代码还不成熟,需要随时检查解析的有没有错误。
楼主中年大叔甲 时间:2022-10-02 10:16:25 北京
  现在正在进行的是Magic的第二个能力,就是对文件系统的封装,使得可以通过表达式访问文件系统以及读写文件。看这个基本表达式: os.cd("d:/test/").add("test1.csv"), 希望Magic执行这个表达式之后可以在d盘test文件夹下新建一个文件test1.csv

  

  现在在报错哈,panic了。原因主要是Magic有一个特性叫做主属性跳转,这个特性目前还没有正确实现。
楼主中年大叔甲 时间:2022-10-02 10:51:41 北京
  由于记录属性的容器是无序的,在Entity结构加一个PPK字段好了

  


作者:余小鱼 时间:2022-10-02 11:13:07 海南
  坐等更新
楼主中年大叔甲 时间:2022-10-02 12:04:55 北京
  主属性跳转是我自己编造的名字,我不知道主流的脚本语言系统里有没有这个概念,但是在Magic里这个很重要,因为它可以简化表达式的书写。以上面的例子为例,os在我的解释过程中会解释成一个封装后的Entity,os在概念上除了文件系统还有别的东西,比如硬件信息等等,但是文件系统的的确确是os的一个主要组成部分。所以os这个Entity目前具有files这个属性用来代表文件系统,但是我又不希望每次写表达式都写成os.files.cd("d:/test"),这样的话如果给os设置一个主属性的话,Magic就有办法让os跳过这个主属性直接进入文件系统,从而简化表达式成os.cd("d:/test")。
楼主中年大叔甲 时间:2022-10-02 12:50:18 北京
  由于文件系统的封装代码之前已经都写好了,所以现在把主属性跳转和add解析做好之后已经好了...

  

  前进了一小点点。。。
楼主中年大叔甲 时间:2022-10-02 13:17:52 北京
  今天中午孩妈不在家,给娃烤点鸡翅


  
楼主中年大叔甲 时间:2022-10-02 15:45:07 北京
  先把ls简单实现一下先:
  os.cd("d:/test").add("test1.csv").add("test2.csv").add("test3.csv").ls()


  


  

楼主中年大叔甲 时间:2022-10-02 15:49:59 北京
  remove:

  
楼主中年大叔甲 时间:2022-10-02 16:21:44 北京
  接下来对数组或列表做一下支持,虽然底层已经写了容器,但是还没有和表达式关联。
  最简单的数组长这样: [1,3,5]

  

  现在还在报错,因为之前没有处理过中括号的出现
楼主中年大叔甲 时间:2022-10-03 13:57:54 北京
  上午尝试做包子,馅料好吃但发面失败了,太硬了
楼主中年大叔甲 时间:2022-10-03 14:46:50 北京
  在Maigic里中括号有两种作用,第一种是取属性,第二种才是定义数组。这两种都需要支持。昨天把相关代码调整了一下,现在看起来定义数组部分已经可以初步work了。

  

  不过取属性还是不对,拿os的"files"属性为例:

  

  然而,靠.去取属性是对的

  

  中括号因为有多种含义处理起来要麻烦些

楼主中年大叔甲 时间:2022-10-03 17:28:33 北京
  下午改改代码,现在Magic的[]已经比较完善了,可以取属性,可以按索引取孩子,也可以当做数组。

  

  解释一下[1,3,5][1], 这就是从数组中取索引为1的元素,因为是以0为基计数的,所以结果是第二个元素3。
楼主中年大叔甲 时间:2022-10-03 17:43:26 北京
  现在有一点好玩了,看这个表达式: [].add(1).add("a").add(100).ls().remove(2).ls()

  

  简单解释:首先空数组添加三个元素然后输出紧接着删除第三个元素然后再输出
楼主中年大叔甲 时间:2022-10-03 17:52:22 北京
  接下来顺便把addAll和count也支持一下吧
作者:lxc19851985 时间:2022-10-03 20:22:16 上海
  没看懂你这个java程序有啥用
楼主中年大叔甲 时间:2022-10-03 20:29:21 北京
  addAll:
  os.cd("d:/test").add("subdir/").cd("subdir").addAll(["sub1.csv","sub2.csv","sub3.csv"])

  

  上面的表达式就是在d盘test文件夹下新建一个叫subdir的子文件夹,然后在subdir里同时加入3个文件。新建文件夹和新建普通文件的区别是文件名结尾是否是"/",接口都是add.
楼主中年大叔甲 时间:2022-10-03 20:42:38 北京
  count简单实现了一下,count按照原计划可以给定一个统计条件,现在不考虑条件,简单的返回全部数量:

  

  。。。这个表达式及计算结果不解释
楼主中年大叔甲 时间:2022-10-03 20:52:06 北京
  接下来实现一下数组的加减乘除,这几个基本运算符都预留了接口,只要把数组实现一下对应接口即可

  

  我是c++程序员,所以命名风格都是沿袭老一辈的c++命名规范。
楼主中年大叔甲 时间:2022-10-03 21:04:32 北京
  @lxc19851985 2022-10-03 20:22:16
  没看懂你这个java程序有啥用
  -----------------------------
  现在还没什么功能,做不了什么事情,后续支持数据库后会有点用
楼主中年大叔甲 时间:2022-10-04 11:00:55 北京
  天涯有办法删除不相关的回复吗?
作者:泛波轻舟 时间:2022-10-04 16:05:58 山东
  老程序猿,就简化叫你老猿吧! 老猿,你千万别把大家带沟里去
楼主中年大叔甲 时间:2022-10-04 19:31:46 北京
  @泛波轻舟 2022-10-04 16:05:58
  老程序猿,就简化叫你老猿吧! 老猿,你千万别把大家带沟里去
  -----------------------------
  谢谢您,太高估我了,我要有这号召力就不在这儿建树洞了
我要评论
楼主中年大叔甲 时间:2022-10-04 19:32:31 北京
  今天去动物园半天,走累了
作者:九五之纹 时间:2022-10-05 08:42:45 黑龙江
  一个也看不懂啊
楼主中年大叔甲 时间:2022-10-05 10:52:28 北京
  数组的加减乘除运算比预计的要麻烦,因为要处理各种类型包括字符串。现在已经支持好了。规则如下:数组加数组等于两个数组的元素各自相加,数组加数字等于数组的每个元素加这个数字。

  

  

  数组支持基本运算后,18楼的表达式可以改为:
  os.cd("d:/test").add("subdir/").cd("subdir").addAll("sub"+[1,2,3]+".csv")

  
楼主中年大叔甲 时间:2022-10-05 11:21:00 北京
  接下来是文件读写,这个也是底层已经写了。Magic需要强化一下cd,这样就可以进入文件内部了,加油!
作者:末路游荡 时间:2022-10-05 21:30:29 浙江
  楼主可以大概说说你搞的这个程序大概功能?
作者:赣州百誉 时间:2022-10-05 21:46:08 江西
  楼主在哪里?
作者:ty_144469140 时间:2022-10-05 23:50:58 北京
  这是go语言吧
楼主中年大叔甲 时间:2022-10-06 09:28:53 北京
  @末路游荡 2022-10-05 21:30:29
  楼主可以大概说说你搞的这个程序大概功能?
  -----------------------------
  计算一个表达式,我主要是要做系统读写,具体功能和封装进度有关系,比如说我封装了文件系统就会具有文件系统的读写能力,比如说封装了excel就会具有excel文件的读写能力。
楼主中年大叔甲 时间:2022-10-06 09:30:32 北京
  @ty_144469140 2022-10-05 23:50:58
  这是go语言吧
  -----------------------------
  是的
作者:末路游荡 时间:2022-10-06 15:37:06 浙江
  @ty_144469140 2022-10-05 23:50:58
  这是go语言吧
  -----------------------------
  @中年大叔甲 2022-10-06 09:30:32
  是的
  -----------------------------
  楼主还挺新潮的,玩的语言挺时髦的
作者:末路游荡 时间:2022-10-06 15:41:26 浙江
  @ty_144469140 2022-10-05 23:50:58
  这是go语言吧
  -----------------------------
  @中年大叔甲 2022-10-06 09:30:32
  是的
  -----------------------------
  @末路游荡 2022-10-06 15:37:06
  楼主还挺新潮的,玩的语言挺时髦的
  -----------------------------
  楼主能从老程序猿的角度简单说说GO语言如何?比C#强吗
我要评论
作者:ty_144469140 时间:2022-10-07 00:24:34 北京
  哈哈哈,老程序员还有用go的,我以为老程序员都用c和汇编呢
作者:ty_144469140 时间:2022-10-07 00:25:58 北京
  

@末路游荡 2022-10-05 21:30:29

楼主可以大概说说你搞的这个程序大概功能?

-----------------------------
  @中年大叔甲 2022-10-06 09:28:53

计算一个表达式,我主要是要做系统读写,具体功能和封装进度有关系,比如说我封装了文件系统就会具有文件系统的读写能力,比如说封装了excel就会具有excel文件的读写能力。


  -----------------------------
  楼主你想实现的,有现成的轮子啦
作者:ty_144469140 时间:2022-10-07 00:27:05 北京
  以前写java,这几年go流行起来了,我写了快3年go了
我要评论
楼主中年大叔甲 时间:2022-10-07 01:09:13 北京
  给文件加了lines属性和bytes属性,分别代表文本文件的行数据和二进制数据的字节数据。
  看这个添加文本行的用法:

  

  获取一行数据:

  



楼主中年大叔甲 时间:2022-10-07 01:31:57 北京
  lines作为文件主属性也可以省略:
  os.cd("d:/test/testX.csv").addAll([1,2,3]+","+[10,20,30])


  
楼主中年大叔甲 时间:2022-10-08 00:11:05 北京
  今天主要在重构解析成树结构的代码。

  写二进制格式的文件举个例子吧:

  

  读取一个二进制字节:

  
楼主中年大叔甲 时间:2022-10-08 00:15:12 北京
  文件的文本读写和二进制读写暂时到此为止,下一步支持日期时间类型,前路漫漫~
作者:luanwei208 时间:2022-10-08 09:02:03 山东
  你直接开发个编译器不就行了?
  • 中年大叔甲: 举报  2022-10-09 09:16:20 北京  评论

    解析表达式的部分确实和编译器开发有类似或重叠的一部分,不过编译器太专业了俺整不来
我要评论
楼主中年大叔甲 时间:2022-10-09 19:40:55 北京
  获取当前时间:

  
楼主中年大叔甲 时间:2022-10-10 09:59:16 北京
  时间比较:

  

  取日期的属性:


  
作者:wlj93036 时间:2022-10-12 21:23:45 四川
  20多年前用FOX编写财务人事数据库管理软件,完成一项任务大多要写运行,显示,打印三个程序,打印程序用户有不同要求,加上打印机不同要难编一些,很久不干这个不知如何了。
  • 中年大叔甲: 举报  2022-10-12 23:08:00 北京  评论

    我就是从FoxBase开始学习应用软件开发的。FoxBase后来被微软收购后推出Visual FoxPro,后来市场基本被分布式关系数据库和Java/.Net技术体系取代了。
我要评论
作者:wlj93036 时间:2022-10-12 21:36:14 四川
  有时利用一个巧妙的数列通式进行控制有一种如释重负的感觉,现在读高中的小孩拿一些难度大的数列给我看,基本很快给他解析出来,跟他说以前搞这个多了,靠这个吃饭呢
楼主中年大叔甲 时间:2022-10-13 18:55:52 北京
  一个人的晚餐未免单调

  

  
楼主中年大叔甲 时间:2022-10-15 00:27:16 北京
  解析字符串成为时间比较费劲,主要是GO的time库的解析格式太拧巴了,我还是向JAVA的日期格式靠拢吧。

  
楼主中年大叔甲 时间:2022-10-15 23:58:19 北京
  格式化输出:

  
楼主中年大叔甲 时间:2022-10-16 00:17:44 北京
  接下来支持条件查询,现在Magic还没有函数的概念,这个会牵扯延迟解释,又要大改一下。
楼主中年大叔甲 时间:2022-10-22 01:05:28 北京
  对string做点支持:

  
楼主中年大叔甲 时间:2022-10-29 13:16:52 北京
  最近在思考和探索在Magic中加入变量的问题,暂时计划有三种变量定义及赋值的语法。到目前先实现了第一种,语法如下:

  var.x(2).y(3)

  这样就定义了两个变量x和y,同时也初始化了这两个变量的值。
  关于变量取值:

  var.x(3.5).y(time.now()).x(x+2).ls()

  结果如下:

  

  所以var整体就是个变量的集合了,这样声明变量会简单一些,我们也能看到x的值通过x+2从3.5变到了5.5
楼主中年大叔甲 时间:2022-10-29 14:40:37 北京
  再看一个:

  

  这样变量d,M和y里就有了对应的值
发表回复

请遵守天涯社区公约言论规则,不得违反国家法律法规