- 帖子
- 8
- 积分
- 33
- 技术
- 4
- 捐助
- 0
- 注册时间
- 2013-2-16
|
[其他] 最强大的批处理计算器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
评分人数
-
|