标签:编程语言
这里我要引用一段文字。
”人类学语言时,学的不仅是听还有说;学字时,学的不仅是读还有写;而现在随着我们向一个越来越数字化的世界迈进,我们也不仅应该学会如何使用程序,还要学会如何开发程序。在未来,面对着一个高度程序化的世界,如果你不能开发软件,那么你将变成软件。就是这么简单:要么编程,要么被编程(Program or Be Programmed)。“
这段文字原作是著名的媒体技术学者 Douglas Rushkof,我看到这段话是36氪上面翻译的。作为程序员,我看到这样的话很受用。你的自动洗衣机、你的电视遥控器、你的手机上面都运行着程序。程序的重要性毋庸讳言。
而且说不准我们整个世界也是上帝设计的模拟人生程序呢。我经常真心觉得我们整个世界都是程序。了解编程也许是了解我们这个世界的关键呢。我举些例子,这些例子也许是出自哪些科幻小说或科普文章里面的,我记不清了。
电子绕着原子核在轨道上运行,而行星绕着恒星在轨道上运行,这像不像一个偷懒(聪明)的程序员用面向对象的方法把一个模型应用到两个地方?
整个宇宙信息传播的速度不能超过光速,这像不像是我们所处世界这个模拟人生游戏运行的主机处理器处理能力的限制?
古代有很多神话,像女娲补天和后羿射日,这像不像是由于古代是程序的1.0版本缺陷(bug)比较多,而现在是2.0版本这些缺陷被修复了?
这些例子是否说服了你整个世界可能是程序呢?让我们用程序和这个世界说你好吧。
介绍编程语言的书籍惯例第一个程序都是”你好世界(hello world)“,她能给入门者以信心,编程也不是那么难的;另外她也可以确保编程和执行程序的环境准备妥当。亲密数编程语言可以直接在浏览器中运行,你需要的只是能上网的电脑(或手机)。打开亲密数编程语言的读人运算输出循环(REPL)环境的链接。如果成功的话(需支持JavaScript),你会看到三个区域分别是输入、输出和画布。
输入框用来输入程序。输出框用来显示程序输出结果。画布用来显示图形。
下面在输入框输入你好世界
,再按回车健(或者点运行按钮),然后输入看
,再按回车键, 输出框会显示结果如下。
亲> 你好世界
亲> 看
你好世界
亲>
我们的第一个和世界问好的程序就写完了。稍微解释一下,你好世界
是字串,你输入字串时它被放到了栈中。而看
是关键字,用来显示栈中的所有内容。
对于计算机语言来说,算数运算是小意思。需要注意的是亲密数编程语言采用逆波兰表达式,也即后缀表达式。在要计算1 + 2
时,你需要输入1和2加
或者一和二加
。这里和
和加
是关键字。和
用来分开数字,加
用来进行加法运算。见下面程序。同样用看
来查看结果。
亲> 一和二加
亲> 看
三
亲>
除了加法运算,亲密数编程语言支持乘法、除法、减法和取余数(目前只支持整数的运算,不支持浮点数的运算),对应的关键字分别是乘
,除
,减
,余
。
下面的程序计算
亲> 三和二加四和一加乘五除
亲> 看
五
亲>
什么是栈?你可以想象一摞碗。大部分时候,放碗时从上面放,取碗时从上面取。后放的先取。在计算机语言中,栈用得很多。在亲密数编程语言中,它就更重要了。
既然栈是如此的重要,下面要着重介绍下对栈进行操作和查看的关键字。
前面我们用到了看
,是用来查看栈里面的所有内容。例如下面的程序会显示五〇六〇
。
亲> 五〇和六〇看
五〇六〇
亲>
但这里有个问题,我们不知道它代表五〇
和六〇
两个数还是五千零六十
一个数。关键字现
同样会输出栈中的内容,但是会用和
来分开栈内的不同元素。这样在有些时候是非常必要的。见下面的程序。
亲> 五〇和六〇现
五〇和六〇
亲>
有时我们不需要输出栈中的所有元素,而只需要输出栈顶的元素,这个时候可以用瞥
。
亲> 五〇和六〇瞥
六〇
亲>
如果要清除栈里面的所有内容,则用清
;如果只是想去掉栈顶的元素,则用丢
;如果想复制栈顶的元素,则用双
;如果要交换栈顶的两个元素,则用换
。下面的程序计算四的平方减去三的平方
用到了这些关键字。
亲> 清
亲> 三双乘四双乘现
九和一六
亲> 换减现
七
亲> 丢
亲> 现
亲>
对栈进行输出操作的关键字如看
、现
和瞥
都不会改变栈中的内容。其余的会改变栈的内容。丢
和双
对栈顶一个元素进行操作。换
对栈顶的两个元素进行交换。还有一个关键字环
,会影响栈顶的三个元素。这个关键字会把栈顶的第三个元素取出然后放到栈顶成为栈顶第一个元素。下面是环
的应用的一个例子。
亲> 千和百和十现
一〇〇〇和一〇〇和一〇
亲> 环现
一〇〇和一〇和一〇〇〇
亲>
看了前面的介绍,你对亲密数编程语言应该有了初步的了解。可介绍了那么多关键字,记不住怎么办呢?关键字字
可以查看亲密数编程语言字典里支持的所有关键字。关键字帮
可以查看这些关键字的简短的描述。关键字数
可以查看亲密数编程语言支持的所有数字。字典里的字将来会增加或有变化。用户也可以自己定义字。在后面的章节会有介绍如何自己定义关键字。
亲> 字
字帮数现看调瞥丢清换双环加减乘除余负和始终转行重若不择当设纯布移线擦步走跳顺逆色
亲> 帮
字--输出字典里的所有字
帮--获取帮助
数--输出所有支持的数字
现--输出栈的内容(带分隔符)
看--输出栈的内容(不带分隔符)
调--输出栈的详细内容供调试用
瞥--输出(但不丢掉)栈顶元素
丢--丢掉栈顶元素
清--清空栈
换--交换栈顶的两个元素
双--复制栈顶元素
环--轮换栈顶的三个元素
加--栈顶的两个元素相加
减--栈顶的两个元素相减
乘--栈顶的两个元素相乘
除--栈顶的两个元素相除
余--栈顶的两个元素求余数
负--栈顶元素乘负一
和--用来分开相邻的数字或字串
始--标识列表开始
终--标识列表结束
转--转义接下来的字
行--执行一个列表
重--重复执行指定次数
若--如果真则执行
不--除非真(如果假)则执行
择--如果真则执行候选一如果假则执行候选二
当--如果真则一直执行
设--自定义字
纯--清除所有自定义字
布--显示画布的属性
移--移动到指定位置
线--画线到指定位置
擦--清除画布上的内容
步--设置步长
走--走一步(留下痕迹)
跳--跳一步(不留下痕迹)
顺--向右转(顺时针)
逆--向左转(逆时针)
色--设置颜色(红,绿,蓝)
亲> 数
0123456789
0123456789
〇一二三四五六七八九
零壹贰叁肆伍陆柒捌玖
十拾百佰千仟万亿
亲密数编程语言目前支持的数据类型有整数,字串,关键字,列表。
100
或百
或一〇〇
等是整数类型。整数类型可以参与算术运算,还可以作为关键字的参数。
中国人
、牛
等是字串类型。
亲密数编程语言字典里定义的字是关键字。字典里包括系统预定义的字和用户自定义的字。用户自定义的字不能覆盖系统预定义的字。用户自定义的字可以覆盖用户自定义的字。
可以用字
查看字典中包含的所有字。
列表类型以关键字始
开始,以关键字终
结束。在定义列表的时候,其中的内容当做普通的字串。但可以通过关键字行重若不择当
等来运行列表中的内容。也可以通过关键字设
来定义关键字为一个列表,之后调用这个新定义的关键字就相当于执行此列表中的内容。列表类型是构造控制语句的重要组成部分,可以说它亲密数编程语言的辕马。
下面的程序用到了数字,字串,列表。
亲> 10和20和30始加加只羊终
亲> 现
一〇和二〇和三〇和始加加只羊终
亲> 行
亲> 看
六〇只羊
关键字行
用来执行列表中的内容,我们是第一次用到。后面讲控制语句时,列表会有更多应用。
前面的程序都是顺序执行的,平铺直叙。如果程序都是这样执行,也没什么值得骄傲的。程序应该让电脑帮我们做我们人类不擅长但电脑擅长的工作,比如重复做一件事很多次。
关键字重
用来重复执行列表或关键字。下面的程序会输出10次我爱你
。
亲> 清
亲> 1和10始瞥1加我爱你瞥丢终
亲> 重
一
我爱你
二
我爱你
三
我爱你
四
我爱你
五
我爱你
六
我爱你
七
我爱你
八
我爱你
九
我爱你
一〇
我爱你
经常我们需要根据一定前提条件来决定做什么事情。比如: 如果天下雨,我就洗头,如果掉到河里,我就洗澡。如果你不来,我就一直等。这里天下雨
,掉河里
,你不来
都是前提条件。天下雨
和掉河里
是肯定的前提条件。你不来
是否定的前提条件。
亲密数编程语言没有专门的布尔值,而是象C语言一样用0和非0代表假和真。如果栈上面的元素是0值,则代表前提条件是假。如果栈上面的元素是非0值,则代表前提条件是真。
关键字若
代表如果
,用于判断肯定的前提条件,如果前提条件为真,则执行语句。
下面的程序用到了关键字若
。
亲> 1
亲> 始我爱你终
亲> 若
亲> 现
我爱你
关键字不
代表除非
,用于判断否定的前提条件,如果前提条件为假,则执行语句。
下面的程序用到了关键字不
。
亲> 清
亲> 0
亲> 始我恨你终
亲> 不
亲> 现
我恨你
关键字择
用于综合如果
和除非
的场景。它的语义相当于,如果前提条件为真则执行语句一否则执行语句二。
下面的程序用到了关键字择
。
亲> 清
亲> 1始我跟你玩终始我不跟你玩终
亲> 择
亲> 现
我跟你玩
在重复的次数已知的情况下,我们可以用关键字重
。如果需要根据一个前提条件决定什么时候结束重复,则可以用关键字当
。
关键字当
首先取出栈顶的列表或字串作为要执行的语句,然后再取出接下来的元素作为前提条件。当前提条件为真时,执行语句,否则不执行。在执行完语句后,它仍会从栈中取出下一个元素,通过判断是否为真来决定是否继续执行。可以通过在执行的语句中修改栈顶的元素,来控制循环是否继续。
下面的程序用到了关键字当
来输出一〇
到一
。
亲> 清
亲> 10和10始瞥1减双终
亲> 当
一〇
九
八
七
六
五
四
三
二
一
如果亲密数编程语言只能使用预定义的关键字,那么它就是封闭的,就像当前中国的互联网;如果它允许用户自己定义新的关键字,那么它就是开放的,就像当前美国的互联网。亲密数编程语言是开放的,它允许使用关键字设
来定义新的关键字。
可以定义新的关键字为一个数字。比如下面的程序定义兆
为一百万。
亲> 清
亲> 兆
亲> 1000000
亲> 设
亲> 兆兆加
亲> 现
二〇〇〇〇〇〇
可以定义新的关键字为一个字串。比如下面的程序定义我
为字串自恋自大狂
。这里使用了一个新的关键字纯
,用于清除所有用户定义的关键字。
亲> 清
亲> 纯
亲> 我和自恋自大狂
亲> 现
我和自恋自大狂
亲> 设
亲> 现
亲> 我我我
亲> 看
自恋自大狂自恋自大狂自恋自大狂
定义新关键字为数字或字串可以把这个关键字当作变量来用。还可以定义新的关键字为包含其他关键字的字串或列表。
下面的程序定义关键字方
用来计算平方,定义关键字立
用来计算立方,分别用字串和列表的方式定义新字。字串中包含关键字乘
和双
,为了推迟运算,要用关键字转
来进行转义。在列表中,始
和终
之间的字本来已经进行了转义,所以就不需要关键字转
了。在始
和终
之间如果要包含额外的终
关键字,则需要关键字转
。
亲> 清纯
亲> 方和转双转乘设
亲> 立始双双乘乘终设
亲> 2方瞥
四
亲> 2立瞥
八
有时一张图胜过千言万语(A Picture Is Worth a Thousand Words)。亲密数编程语言的语法是受forth语言的启发,亲密数编程语言画图功能是受logo语言的影响。在前面的程序中,我们用到了输入、输出区域,现在可以用画布区域了。
我们画图的坐标系叫迪卡坐标系。画布上面任一点由横纵坐标确定。在这个坐标系中,左上角坐标是(0,0),往右横坐标增加,往下纵坐标增加。
关键字擦
用于清空画布。
关键字移
从栈顶取两个整数做为横纵坐标确定一点,然后把光标移动到这个点。
关键字线
从栈顶取两个整数做为横纵坐标确定一点,然后画一条线到这个点,同时移动光标。
下面的程序用移
和线
这两个命令画一个三角形。
亲> 清纯擦
亲> 100和100移
亲> 300和300线
亲> 100和300线
亲> 100和100线
亲> 10和10移
如果知道logo语言的话,就知道在logo语言中,用户可以用控制一只海龟(tortoise)来画图。用户可以让它前进、左转、右转等。这个时候用户可以忘掉迪卡坐标系,只考虑自己(海龟)的坐标系。这个坐标系就是海龟坐标系,这种几何学就叫海龟几何学,这种图形叫海龟图。
亲密数编程语言受logo语言启发,也可以控制一只小海龟来画海龟图。但因为她是本土的中文编程语言,这里我觉得叫土鳖比较适合。所以亲密数编程语言可以控制一只小土鳖来画土鳖图。(我的老家有一句骂人的话叫”龟孙子王八犊子鳖亲家”,看来这三种动物是差不多的。)
下面是鳖图相关的命令。
关键字布
用来查看当前画布的属性。可以查看画布宽度、高度,小土鳖当前位置、步长、颜色、朝向。见下面程序。
亲> 布
宽度1422
高度320
坐标(10,10)
颜色rgb(0,0,0)
步长16
朝向北
初始时,小土鳖是朝北的(上北下南左西右东),步长是16像素,颜色是黑色。
关键字走
让小土鳖朝当前朝向走一步,从而在画布上画出一条痕迹。
关键字跳
让小土鳖朝当前朝向跳一步,从而在画布上不会留下痕迹。
关键字顺
让小土鳖向右转,即顺时针转90度。
关键字逆
让小土鳖向左转,即逆时针转90度。
关键字步
可以重新设置步长。它会取栈顶的元素当作步长。
关键字色
可以重新设置颜色。它会取栈顶的三个元素,分别代表红、绿、蓝的颜料值,混合起来构成当前颜色。颜料值的取值范围是0到255。
下面的程序用鳖图命令画4个正方形。
亲> 10和10移
亲> 方始顺走走顺走走顺走走顺走走终设
亲> 方
亲> 32步
亲> 方
亲> 64步
亲> 方
亲> 255和0和0色
亲> 128步
亲> 方
据说Ruby语言的发明人松本行弘经常到社区上看别人的程序来发现一些Ruby语言的新用法。虽然我实现了亲密数中文编程语言,但是很多她未知的潜力我是预料不到的。我希望看到你来用她来做一些有趣的事,然后让我大吃一惊。
标签:编程语言
原文地址:http://blog.csdn.net/xuhx/article/details/45348027