- 论坛徽章:
- 0
|
本帖最后由 星条旗 于 2012-12-02 09:35 编辑
喜欢用dc写程序的有两种人:
1.那些热衷搞机械指令集的老派的程序员。
2.喜欢让别人和自己都读不懂自己所写程序的偏执狂。
那段出名到被维基百科的dc programming页码中列出的,神秘难懂,用来求质数的dc程序,额估计就是后者写的。
http://bbs.chinaunix.net/thread-316197-2-1.html
但是由于dc 语言独特的语法模型结构,花一点时间深入一下还是有好处的。
对dc程序命令和逆波兰一窍不通的童鞋先去看入门介绍:
http://bbs.chinaunix.net/thread-2303294-1-1.html
http://en.wikipedia.org/wiki/Dc_(computer_program)
http://www.mkssoftware.com/docs/man1/dc.1.asp- ok,首先,先来做做热身:
- dc为逆波兰式运算,k命令将主栈栈顶的值弹出,并设置为计算精度 ,p命令打印栈顶值到终端
- dc -e '2k 1 2 3 * / p'
-
- r命令 交换主栈栈顶头两个值的位置。
- dc -e '2k 2 3 * 1 r / p'
-
- ? 表示用户可键入标准输入,sA和 lA为对寄存器A的操作,用来释放和储存临时变量,寄存器也是一个栈。
- 此程序用来计算欧拉常数E,输入值为迭代次数。
- dc -e '100k ? sAlA1r/1+lA^ p'
-
- 下面展示了一个基本的dc程序循环流程,类似于c中的for或while。
- z命令取到主栈长度并将该值压入主栈,d命令为复制栈顶值并将该值压入主栈。
- <J为条件判别,当主栈顶的头两个值a,b符合b<a时弹出 a ,b 并跳转到寄存器J,执行J的顶的命令。
- x为执行主栈顶部[ ... ]中的命令,并将[ ... ]弹出。
- 此程序计算了主栈中所有数值的和。
- dc -e '1 2 3 0 4 0.5 2 k z [sR + lR 1- d1<J]sJlJx sK p'
-
- 注意 dc所接受的输入也必须是逆波兰形式。
- f命令表示打印整个主栈。
- dc -e '? f'
- 1 0 1 -
- -1
- 1
- dc -e '? f'
- 1 2 3 + 1
- 1
- 5
- 1
-
- dc -e '1[d 1+ d3>R ]sRlRx f '
- 下面分析一下这个程序,列个表来表述最清楚。。
- 命令 1 [d 1+ d3>R ]sR lR x d 1+ d3 >R 。。。
- 主栈 1 1 1 [d 1+ d3>R ] 1 1 2 2 3 1 2 。。。
- 寄存器R 空 [d1+ d3>R ] [d..不变] [d..不变] [d..不变] [d..不变]
- 继续上面的表格,程序继续运行寄存器R的栈顶的 [d1+ d3>R]内容
- 命令 d 1+ d3 >R 循环结束 f
- 主栈 1 2 3 3 3 1 2 3 1 2 3
- 寄存器R [d..不变] [d..不变] [d..不变]
- 所以最后到f命令打印主栈内容的结果到终端,最后是 3 2 1
- 我的运行环境
- simone@Infinite-Inspiron:~/shell$ uname -a
- Linux Infinite-Inspiron 3.5.0-17-generic #28-Ubuntu SMP Tue Oct 9 19:31:23 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
- simone@Infinite-Inspiron:~/shell$ bash --version
- GNU bash, version 4.2.37(1)-release (x86_64-pc-linux-gnu)
- Copyright (C) 2011 Free Software Foundation, Inc.
- simone@Infinite-Inspiron:~/shell$ uname -a
- Linux Infinite-Inspiron 3.5.0-17-generic #28-Ubuntu SMP Tue Oct 9 19:31:23 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
- 如果大家还感兴趣的话,额会继续来写几段稍微复杂点的:)
复制代码 |
|