[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[其他] 最强大的批处理计算器bmathematics

摁,首先请管理员帮我转移到 原创代码那一块。
这是我很久以前写的代码了,所以来分享一下。
批处理,从程序语言的设计上来说是很坑爹的,所以显出这个程序写出来的不易了。

首发于贴吧 http://tieba.baidu.com/p/4636526267?pn=1

首先是简单的四则运算和括号嵌套,这个不必说了吧

[attach]10587[/attach]

注意的是由于内置parser的缺陷(其实是我当时太naive),负数请写成(0-x)

函数运算
[attach]10588[/attach]

negative函数:取反
sum函数:求和
max,min:取最大最小值
mod:取余
cube:3次方
square:平方和

变量定义和自定义函数(最多可支持二元函数的自定义):由于内置parser的缺陷,请使用 英文小写字母进行定义

[attach]10589[/attach]

bmathematics还支持pattern matching,递归函数定义和memorization optmization。
1.如何在bmathematics中定义fibnacci数列
fibnacci数列的递推式 fib(x)=fib(x-1)+fib(x-2)
fib(1)=1
fib(2)=1
[attach]10590[/attach]
memorization optimization是指记忆优化,当程序已经计算了f(n)的值后,会自动将结果存储起来,下一次就不需要重复计算。

2.在bmathematics定义等比/等差数列
a(1)=1
a(x)=a(x-1)*2


a(1)=1
a(x)=a(x-1)+2
还可以定义阶乘函数:
factor(0)=1
factor(1)=1
factor(x)=factor(x-1)*x
一股浓浓的fp的味道

3.
bmathematics案例学习--定义乘方函数
有人可能要说了,bmathematics中没有提供计算n次方的方法,在批处理中可以用^来计算x的y次方。
为什么没有提供?因为你自己就可以定义
power(x,y) --x的y次方
power(x,0)=1 ;x的0次方等于1
power(x,1)=x ;x的1次方等于x
power(x,y)=x*power(x,y-1)
[attach]10592[/attach]
4.
bmathematics案例学习--求最大公约数(**)
我们现在想要在bmathematics中求两个数的最大公约数,而bmathematics中却没提供相关的函数怎么办?
自己定义呗
辗转相除法:
**(x,0)=x
**(x,y)=**(y,mod(x,y))
就这么简单
[attach]10591[/attach]

由于内置parser的缺陷,对负数进行pattern matching可能引起潜在的错误比如f(-1)=1

最后
仅仅简单的计算器其实是一个很复杂的产物,包含了很多特性。
本来我是想写个parser combinator来解析expression的,但是发现速度堪忧,于是改成手写parser。
递归函数和pattern matching是我觉得很cool而加进去的。
批处理在设计上有很多问题,所以我转战racket(一种强大的lisp方言)了,欢迎大家 关注我的知乎:https://www.zhihu.com/people/syntacticlosure/activities

提供一些原理上的解析:
对于一个表达式 23+56*90 首先进行tokenize
分解为 token_1=23
token_1_type=number
token_2=+
token_2_type=operator
.....
然后对tokens进行parse,手写递归下降parser
在parse的同时生成结果,对于函数,查看mem_f_arg?里面有没有储存结果,如果有,直接取值,如果没有,计算后记忆。

[attach]10593[/attach]
1

评分人数

回复 5# 3518228042

如果你有这样的需求的话,我可以帮你写程序,加我qq1227847322

TOP

回复 3# happy886rr
不只加减乘除哦,只是由于没有使用第三方,所以无法提供一些复杂的函数
关于小数,只要对tokenizer进行一些加强,有兴趣你可以试试看

TOP

返回列表