亲密数编程语言旋风式的介绍

为什么要学编程

这里我要引用一段文字。

”人类学语言时,学的不仅是听还有说;学字时,学的不仅是读还有写;而现在随着我们向一个越来越数字化的世界迈进,我们也不仅应该学会如何使用程序,还要学会如何开发程序。在未来,面对着一个高度程序化的世界,如果你不能开发软件,那么你将变成软件。就是这么简单:要么编程,要么被编程(Program or Be Programmed)。“

这段文字原作是著名的媒体技术学者 Douglas Rushkof,我看到这段话是36氪上面翻译的。作为程序员,我看到这样的话很受用。你的自动洗衣机、你的电视遥控器、你的手机上面都运行着程序。程序的重要性毋庸讳言。

而且说不准我们整个世界也是上帝设计的模拟人生程序呢。我经常真心觉得我们整个世界都是程序。了解编程也许是了解我们这个世界的关键呢。我举些例子,这些例子也许是出自哪些科幻小说或科普文章里面的,我记不清了。

电子绕着原子核在轨道上运行,而行星绕着恒星在轨道上运行,这像不像一个偷懒(聪明)的程序员用面向对象的方法把一个模型应用到两个地方?

整个宇宙信息传播的速度不能超过光速,这像不像是我们所处世界这个模拟人生游戏运行的主机处理器处理能力的限制?

古代有很多神话,像女娲补天和后羿射日,这像不像是由于古代是程序的1.0版本缺陷(bug)比较多,而现在是2.0版本这些缺陷被修复了?

这些例子是否说服了你整个世界可能是程序呢?让我们用程序和这个世界说你好吧。

你好世界

介绍编程语言的书籍惯例第一个程序都是”你好世界(hello world)“,她能给入门者以信心,编程也不是那么难的;另外她也可以确保编程和执行程序的环境准备妥当。亲密数编程语言可以直接在浏览器中运行,你需要的只是能上网的电脑(或手机)。打开亲密数编程语言的读人运算输出循环(REPL)环境的链接。如果成功的话(需支持JavaScript),你会看到三个区域分别是输入、输出和画布。

输入框用来输入程序。输出框用来显示程序输出结果。画布用来显示图形。

下面在输入框输入你好世界,再按回车健(或者点运行按钮),然后输入,再按回车键, 输出框会显示结果如下。

亲> 你好世界
亲> 看
你好世界
亲> 

我们的第一个和世界问好的程序就写完了。稍微解释一下,你好世界是字串,你输入字串时它被放到了栈中。而是关键字,用来显示栈中的所有内容。

算数运算

对于计算机语言来说,算数运算是小意思。需要注意的是亲密数编程语言采用逆波兰表达式,也即后缀表达式。在要计算1 + 2时,你需要输入1和2加或者一和二加。这里是关键字。用来分开数字,用来进行加法运算。见下面程序。同样用来查看结果。

亲> 一和二加
亲> 看
三
亲> 

除了加法运算,亲密数编程语言支持乘法、除法、减法和取余数(目前只支持整数的运算,不支持浮点数的运算),对应的关键字分别是

下面的程序计算 (3+2)×(4+1)÷5

亲> 三和二加四和一加乘五除
亲> 看
五
亲> 

操作和查看栈

什么是栈?你可以想象一摞碗。大部分时候,放碗时从上面放,取碗时从上面取。后放的先取。在计算机语言中,栈用得很多。在亲密数编程语言中,它就更重要了。

既然栈是如此的重要,下面要着重介绍下对栈进行操作和查看的关键字。

前面我们用到了,是用来查看栈里面的所有内容。例如下面的程序会显示五〇六〇

亲> 五〇和六〇看
五〇六〇
亲> 

但这里有个问题,我们不知道它代表五〇六〇两个数还是五千零六十一个数。关键字同样会输出栈中的内容,但是会用来分开栈内的不同元素。这样在有些时候是非常必要的。见下面的程序。

亲> 五〇和六〇现
五〇和六〇
亲> 

有时我们不需要输出栈中的所有元素,而只需要输出栈顶的元素,这个时候可以用

亲> 五〇和六〇瞥
六〇
亲> 

如果要清除栈里面的所有内容,则用;如果只是想去掉栈顶的元素,则用;如果想复制栈顶的元素,则用;如果要交换栈顶的两个元素,则用。下面的程序计算四的平方减去三的平方用到了这些关键字。

亲> 清
亲> 三双乘四双乘现
九和一六
亲> 换减现
七
亲> 丢
亲> 现

亲> 

对栈进行输出操作的关键字如都不会改变栈中的内容。其余的会改变栈的内容。对栈顶一个元素进行操作。对栈顶的两个元素进行交换。还有一个关键字,会影响栈顶的三个元素。这个关键字会把栈顶的第三个元素取出然后放到栈顶成为栈顶第一个元素。下面是的应用的一个例子。

亲> 千和百和十现
一〇〇〇和一〇〇和一〇
亲> 环现
一〇〇和一〇和一〇〇〇
亲> 

获取帮助

看了前面的介绍,你对亲密数编程语言应该有了初步的了解。可介绍了那么多关键字,记不住怎么办呢?关键字可以查看亲密数编程语言字典里支持的所有关键字。关键字可以查看这些关键字的简短的描述。关键字可以查看亲密数编程语言支持的所有数字。字典里的字将来会增加或有变化。用户也可以自己定义字。在后面的章节会有介绍如何自己定义关键字。

> 
字帮数现看调瞥丢清换双环等大小与或非加减乘除余负展和始终转行执重若不择当设纯布移线擦步走跳右左色
> 
--输出字典里的所有字
--获取帮助
--输出所有支持的数字
--输出栈的内容(带分隔符)
--输出栈的内容(不带分隔符)
--输出栈的详细内容供调试用
--输出(但不丢掉)栈顶元素
--丢掉栈顶元素
--清空栈
--交换栈顶的两个元素
--复制栈顶元素
--轮换栈顶的三个元素
--等于
--大于
--小于
--栈顶两个元素都为真则结果为真
--栈顶两个元素都为假则结果为假
--改变栈顶元素的真假
--栈顶的两个元素相加
--栈顶的两个元素相减
--栈顶的两个元素相乘
--栈顶的两个元素相除
--栈顶的两个元素求余数
--栈顶元素乘负一
--用用户自定义的字扩展栈顶的列表或字符串
--用来分开相邻的数字或字串
--标识列表开始
--标识列表结束
--转义接下来的字
--执行一个列表
--执行一个列表中系统定义的关键字(忽略用户定义的关键字)
--重复执行指定次数
--如果真则执行
--除非真(如果假)则执行
--如果真则执行候选一如果假则执行候选二
--如果真则一直执行
--自定义字
--清除所有自定义字
--显示画布的属性
--移动到指定位置
线--画线到指定位置
--清除画布上的内容
--设置步长
--走一步(留下痕迹)
--跳一步(不留下痕迹)
--向右转(顺时针)
--向左转(逆时针)
--设置颜色(红,绿,蓝)

> 
0123456789
0123456789
〇一二三四五六七八九
零壹贰叁肆伍陆柒捌玖
十拾百佰千仟万亿

数据类型

亲密数编程语言目前支持的数据类型有整数,字串,关键字,列表。

100一〇〇等是整数类型。整数类型可以参与算术运算,还可以作为关键字的参数。

中国人等是字串类型。

亲密数编程语言字典里定义的字是关键字。字典里包括系统预定义的字和用户自定义的字。用户自定义的字不能覆盖系统预定义的字。用户自定义的字可以覆盖用户自定义的字。
可以用查看字典中包含的所有字。

列表类型以关键字开始,以关键字结束。在定义列表的时候,其中的内容当做普通的字串。但可以通过关键字行重若不择当等来运行列表中的内容。也可以通过关键字来定义关键字为一个列表,之后调用这个新定义的关键字就相当于执行此列表中的内容。列表类型是构造控制语句的重要组成部分,可以说它亲密数编程语言的辕马。

下面的程序用到了数字,字串,列表。

亲> 10和20和30始加加只羊终
亲> 现
一〇和二〇和三〇和始加加只羊终
亲> 行
亲> 看
六〇只羊

关键字用来执行列表中的内容,我们是第一次用到。后面讲控制语句时,列表会有更多应用。

控制语句

前面的程序都是顺序执行的,平铺直叙。如果程序都是这样执行,也没什么值得骄傲的。程序应该让电脑帮我们做我们人类不擅长但电脑擅长的工作,比如重复做一件事很多次。

重复

关键字用来重复执行列表或关键字。下面的程序会输出10次我爱你

亲> 清
亲> 1和10始瞥1加我爱你瞥丢终
亲> 重
一
我爱你
二
我爱你
三
我爱你
四
我爱你
五
我爱你
六
我爱你
七
我爱你
八
我爱你
九
我爱你
一〇
我爱你

分支

经常我们需要根据一定前提条件来决定做什么事情。比如: 如果天下雨,我就洗头,如果掉到河里,我就洗澡。如果你不来,我就一直等。这里天下雨,掉河里,你不来都是前提条件。天下雨掉河里是肯定的前提条件。你不来是否定的前提条件。

亲密数编程语言没有专门的布尔值,而是象C语言一样用0和非0代表假和真。如果栈上面的元素是0值,则代表前提条件是假。如果栈上面的元素是非0值,则代表前提条件是真。

关键字代表如果,用于判断肯定的前提条件,如果前提条件为真,则执行语句。

下面的程序用到了关键字

亲> 1
亲> 始我爱你终
亲> 若
亲> 现
我爱你

关键字代表除非,用于判断否定的前提条件,如果前提条件为假,则执行语句。

下面的程序用到了关键字

亲> 清
亲> 0
亲> 始我恨你终
亲> 不
亲> 现
我恨你

关键字用于综合如果除非的场景。它的语义相当于,如果前提条件为真则执行语句一否则执行语句二。

下面的程序用到了关键字

亲> 清
亲> 1始我跟你玩终始我不跟你玩终
亲> 择
亲> 现
我跟你玩

循环

在重复的次数已知的情况下,我们可以用关键字。如果需要根据一个前提条件决定什么时候结束重复,则可以用关键字

关键字首先取出栈顶的列表或字串作为要执行的语句,然后再取出接下来的元素作为前提条件。当前提条件为真时,执行语句,否则不执行。在执行完语句后,它仍会从栈中取出下一个元素,通过判断是否为真来决定是否继续执行。可以通过在执行的语句中修改栈顶的元素,来控制循环是否继续。

下面的程序用到了关键字来输出一〇

亲> 清
亲> 10和10始瞥1减双终
亲> 当
一〇
九
八
七
六
五
四
三
二
一

关系运算

关系运算指等于大于小于运算。通过关系运算和下面的逻辑运算可以使我们在使用控制语句时得心应手。亲密数编程语言提供了关键字用来做关系运算。可以用于数字和字串。通常只对数字有意义。关键字都比较栈顶的两个元素,返回的结果都或者为真或者为假。

下面的程序用到了关键字

亲> 我和你等
亲> 现
〇
亲> 清
亲> 我和我等
亲> 现
一
亲> 清
亲> 10和5大
亲> 现
一
亲> 清
亲> 10和5小
亲> 现
〇

逻辑运算

前面提到过,亲密数编程语言用0和非0代表假和真。她提供了逻辑运算关键字来操作逻辑值。

操作当栈顶两个元素都为真时,结果为真,否则结果为假。

操作当栈顶两个元素都为假时,结果为假,否则结果为真。

操作改变栈顶元素的真假。若原来为真,则结果为假。原来为假,则结果为真。

下面的程序用到了关键字

亲> 10和5
亲> 现
一〇和五
亲> 与
亲> 现
五
亲> 清
亲> 0和3
亲> 现
〇和三
亲> 或
亲> 现
三
亲> 非
亲> 现
〇

注意,任何非0值都代表真。
- 在操作中,如果第一个元素为真,返回的结果是第二个元素的值。返回的结果不一定总是
- 在操作中,如果第一个元素为真,则返回第一个元素的值,否则返回第二个元素的值。返回的结果不一定总是

定义关键字

如果亲密数编程语言只能使用预定义的关键字,那么它就是封闭的,就像当前中国的互联网;如果它允许用户自己定义新的关键字,那么它就是开放的,就像当前美国的互联网。亲密数编程语言是开放的,它允许使用关键字来定义新的关键字。

可以定义新的关键字为一个数字。比如下面的程序定义为一百万。

亲> 清
亲> 兆
亲> 1000000
亲> 设

亲> 兆兆加
亲> 现
二〇〇〇〇〇〇

可以定义新的关键字为一个字串。比如下面的程序定义为字串自恋自大狂。这里使用了一个新的关键字,用于清除所有用户定义的关键字。

亲> 清
亲> 纯
亲> 我和自恋自大狂
亲> 现
我和自恋自大狂
亲> 设
亲> 现

亲> 我我我
亲> 看
自恋自大狂自恋自大狂自恋自大狂

定义新关键字为数字或字串可以把这个关键字当作变量来用。还可以定义新的关键字为包含其他关键字的字串或列表。

下面的程序定义关键字用来计算平方,定义关键字用来计算立方,分别用字串和列表的方式定义新字。字串中包含关键字,为了推迟运算,要用关键字来进行转义。在列表中,之间的字本来已经进行了转义,所以就不需要关键字了。在之间如果要包含额外的关键字,则需要关键字

亲>  清纯
亲> 方和转双转乘设
亲> 立始双双乘乘终设
亲> 2方瞥
四
亲> 2立瞥
八

生成字串,执行字串

字串在亲密数编程语言中很重要。字串中包含关键字和普通字。关键字有系统定义关键字和用户定义关键字。我们知道可以用来分开字串,可以用来转义关键字为普通字。我们还可以用来把字串当程序执行。

前面介绍了字串可以通过列表来定义,也可以通过连续输入字来定义。下面介绍一种通过替换字串中的字来生成复杂字串的方法。

设用户自定义关键字我知道乙你不知道甲。现在甲中有乙,乙中有甲。我们把甲中的乙替换为乙的定义,则生成的字串中又有甲。这个过程可以一直递归下去。关键字用来替换字串中的用户定义关键字。每调用一次,字串展开一次。可以配合关键字来指定展开的次数。

下面的程序用到了

亲> 甲始我知道乙终设
亲> 乙始你不知道甲终设
亲> 转甲
亲> 现
甲
亲> 展
亲> 现
我知道乙
亲> 展
亲> 现
我知道你不知道甲
亲> 展现
我知道你不知道我知道乙
亲> 展现
我知道你不知道我知道你不知道甲
亲> 展现
我知道你不知道我知道你不知道我知道乙
亲> 展现
我知道你不知道我知道你不知道我知道你不知道甲
亲> 展现
我知道你不知道我知道你不知道我知道你不知道我知道乙
亲> 展现
我知道你不知道我知道你不知道我知道你不知道我知道你不知道甲
亲> 展现
我知道你不知道我知道你不知道我知道你不知道我知道你不知道我知道乙
亲> 展现
我知道你不知道我知道你不知道我知道你不知道我知道你不知道我知道你不知道甲
亲> 展现
我知道你不知道我知道你不知道我知道你不知道我知道你不知道我知道你不知道我知道乙

如果用关键字来执行上面程序中的字串如我知道你不知道甲,则程序一直不会结束,因为甲会调用乙,乙又回头来调用甲,这样会无限次地递归下去。我们要避免这种递归的状况,同时又要执行这样的字串。关键字被引入用来执行一个字串,但是碰到其中的用户定义关键字则忽略。在有些场景下配合,可以生成复杂的字串或程序,尤其是再结合下面将要介绍的画图关键字时,可以生成复杂的图画。

画图

有时一张图胜过千言万语(A Picture Is Worth a Thousand Words)。亲密数编程语言的语法是受forth语言的启发,亲密数编程语言画图功能是受logo语言的影响。在前面的程序中,我们用到了输入、输出区域,现在可以用画布区域了。

坐标系

我们画图的坐标系叫迪卡坐标系。画布上面任一点由横纵坐标确定。在这个坐标系中,左上角坐标是(0,0),往右横坐标增加,往下纵坐标增加。

基本的画图命令

关键字用于清空画布。

关键字从栈顶取两个整数做为横纵坐标确定一点,然后把光标移动到这个点。

关键字线从栈顶取两个整数做为横纵坐标确定一点,然后画一条线到这个点,同时移动光标。

下面的程序用线这两个命令画一个三角形。

亲> 清纯擦
亲> 100和100移
亲> 300和300线
亲> 100和300线
亲> 100和100线
亲> 10和10移

triangle

鳖图

如果知道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步
亲> 方

square

结束语

据说Ruby语言的发明人松本行弘经常到社区上看别人的程序来发现一些Ruby语言的新用法。虽然我实现了亲密数中文编程语言,但是很多她未知的潜力我是预料不到的。我希望看到你来用她来做一些有趣的事,然后让我大吃一惊。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值