formula

从零开始撸一个可扩展函数的数学公式解析轮子(第2部分)

前文请查看:从零开始撸一个可扩展函数的数学公式解析轮子(第1部分) 3. 实现语法树转换 在令牌流的实现中我们讨论了对公式的基本验证,但是对于复杂逻辑的验证,光令牌流则并不能满足需求。比如,我们想要验证多层函数在令牌流层面上实现就很不舒服。所以我们还需要在这之上进行语法树解析。 3.1. 实现原理 首先由于我们需求并不需要实现平衡树,所以只需要实现一个多叉树即可。下面举几个从令牌流解析成树形结构栗子: 比如公式:a+b*30-abs(a-b, c, count(d)) 转换为令牌流为(以|分割令牌字符): a|+|b|*|30|-|abs(

  • bakajinsei
    bakajinsei
4 min read
formula

从零开始撸一个可扩展函数的数学公式解析轮子(第1部分)

0. 前言 在某一天业务方需要做一个可通过自定义函数录入的功能来帮助自己动态配置一些数值的计算,而面临的问题是只有java开源程序能够进行公式的动态配置和计算。作为一个强迫症患者,npm上现有的包并不能满足需求,于是就踏上了从零开始撸公式解析器的道路。 友情提示:查看源码请拉到最后 1. 分析 我们的公式解析器需要能够对语法进行验证,保证公式输入的内容是符合语法且可以任意分拆操作的。同时,还需要对自定义的函数参数进行验参。于是我们把整个解析划分成了两部分。 令牌流解析:把公式解析成顺序的令牌 语法树解析:把解析完成的令牌流转化成语法树内容 2. 实现令牌流的思路 由于令牌流中并不考虑公式的执行问题,所以只需从左至右对一个公式字符串使用正则进行解析,并把相同的内容合并生成一个令牌。 2.1. 带变量的简单四则运算解析 如10+a我们可以分拆为10,+,a 3个令牌。 我们会把每个令牌形成一个如下内容的对象:

  • bakajinsei
    bakajinsei
4 min read
nodejs

node常用跨平台库介绍

最近在写关于node的跨平台服务,介绍一下几个常用的跨平台库: fs-extra git地址 npm地址 fs-extra是一个针对fsAPI的扩展,弥补fs中的一些不足. 你可以同时使用fs和fs-extra: const fs = require('fs') const fse = require('fs-extra') fs-extra提供同步和异步两种API来使用. shelljs git地址 npm地址 shelljs是一款跨平台的脚本命令库,通过shelljs我们可以很方便的使用跨平台脚本命令. 除开常用的cd,rm,grep等命令以外,我们还可以使用exec命令来呼叫外部命令,如 const shell = require('shelljs'); if (shell.

  • bakajinsei
    bakajinsei
1 min read
nodejs

node cli开发介绍

最近在写项目生成工具butter-cli,把vue-cli源码看了一遍,总结一下使用node做cli开发的一些点. 1.package定义 相比普通的npm项目,在package中我们需要增加bin属性以及preferGlobal属性. bin:可以指定一个或多个shell文件,node会在-g安装后自动在node目录生成对应系统的运行文件.详见package.json preferGlobal:可以指定使用命令行运行,如果本地安装时会提示警告.详见package.json 2.使用commander定义cli命令 我们使用commander来定义cli命令的参数,见butter-cli.js #!/usr/bin/env node 'use strict'; const program = require('commander'); const

  • bakajinsei
    bakajinsei
2 min read
nodejs

使用promise创建分页执行任务

在实际应用中,我们总会遇到以下类似的情况: 在构建爬虫时,需要对当前页面下的所有分页爬取结果页,并在结果页爬取相关数据. 在发送结果数据时,需要按一个固定的队列数量,分次发送数据. 在执行数据库操作时,需要固定数量插入. 这种分页型任务在很多应用中都需要自己实现.下面,本文将讨论具体的实现方法: 在之前的文章中,我们使用promise的传递特性来实现中间件部分的功能.今天,我们将使用promise的特性用一个简单的函数来实现上文需要的分页任务方法. 实现思路 在promise语法中,我们拥有Promise.all方法,通过Promise.all,我们可以让一串任务(数组)同时执行,并在所有任务执行完成后返回任务顺序相同的结果数组,如下所示: let promiseList=[new Promise(function(

  • bakajinsei
    bakajinsei
4 min read
promise

Orc开发日志01-使用Promise实现中间件

在Orc Engine开发过程中,需要用到中间件系统(middleware).目的是帮助输入数据按中间件进行流式处理并最终输出处理结果. 实现目的 在预想中,我们通过载入一个中间件函数列表,每个函数包含输入数据及下一步的呼出内容. [function(input,next){ //do something. & call next(err,output) }] 最终,通过读取中间件函数最后一次执行的输入数据,就可以完成一个数据在中间件内部的流式处理. 实现方法 由于es6中Promise本身就可以处理类似的问题,所以我们使用Promise来连接函数和函数之间的处理. /** * Create middleware promise list * @param {Object} taskInputData Task

  • bakajinsei
    bakajinsei
1 min read
nodejs

利用pako更快地传输文件

1. 介绍 1.1. pako介绍 pako是一个javascript编码的zlib高速压缩库,支持浏览器和nodejs. 你可以使用npm npm install pako 或者bower来进行安装 bower install pako 1.2. pako-demo pako-demo使用pako来在浏览器端进行文件压缩,并在服务端解压存储文件,用以节省网络传输流量. 2. 实现说明 2.1. 浏览器端 pako提供浏览器库帮助在浏览器中对文件进行压缩/解压,compressFile步骤如下: 使用readAsDataURL获取文件base64数据并压缩. 发送压缩后数据及文件名到服务端 接收发送结果 还可以通过FileReader其他接口实现

  • bakajinsei
    bakajinsei
2 min read
electron

electron外部插件打包

相关问题 electron Pepper Flash Plugin不能执行. 面临问题 当需要在electron中引入外部插件(如Pepper Flash Plugin)时,打包生成.asar文件后会导致程序不能引用外部插件,从而不能执行插件对应功能. 解决方案 我们需要在打包asar文件时配置unpack选项,在打包时不打包插件目录.下面将以electron-packager为例,说明具体配置. 配置electron-packager 我们需要在electron-packager配置文件中新增asar配置: asar:{ unpackDir:'plugins' } unpackDir定义了我们无需打包的目录,下面是官方提供的几种常见配置: asar.unpackDir = 'sub_dir' 会不打包 /<dir&

  • bakajinsei
    bakajinsei
2 min read