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

    • 为什么要学编程
    • 你好世界
    • 算数运算
    • 操作和查看栈
    • 获取帮助
    • 数据类型
    • 控制语句
      • 重复
      • 分支
      • 循环
    • 定义关键字
    • 画图
      • 坐标系
      • 基本的画图命令
      • 鳖图
    • 结束语

为什么要学编程

这里我要引用一段文字。

”人类学语言时,学的不仅是听还有说;学字时,学的不仅是读还有写;而现在随着我们向一个越来越数字化的世界迈进,我们也不仅应该学会如何使用程序,还要学会如何开发程序。在未来,面对着一个高度程序化的世界,如果你不能开发软件,那么你将变成软件。就是这么简单:要么编程,要么被编程(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减双终
亲> 当
一〇
九
八
七
六
五
四
三
二
一

定义关键字

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

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

亲> 清
亲> 兆
亲> 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语言的新用法。虽然我实现了亲密数中文编程语言,但是很多她未知的潜力我是预料不到的。我希望看到你来用她来做一些有趣的事,然后让我大吃一惊。

时间: 2024-12-24 02:22:20

亲密数编程语言旋风式的介绍的相关文章

亲密数编程语言的定位

亲密数编程语言是试验性质的完全基于汉语的计算机编程语言.我只是闲时用她来探索一下汉语编程,学习一下相关知识,巩固一下个人技能,没有想着用它做严肃的事.我觉得也不该用汉语编程语言做严肃的事情,那些严肃的事情还是留给工业上成熟的语言来做吧.因为能力所限,我也不可能设计一个完美完善的编程语言如Ruby.Python.Go.C.Rust.Julia.Kotlin.Haskell.Clojure.Elixir等.我只能尽量减化.简化的结果就是亲密数编程语言和Forth语言比较相似,是基于栈的编程语言.大部

亲密数

题目: 如果整数A的全部因子(包括1,不包括A本身)之和等于B,并且整数B的全部因子(包括1,不包括B本身)之和等于A,,则称整数A和B为亲密数.求解3000以内的全部亲密数. #include <stdio.h> #include <string.h> int factor_sum(int n) // 计算n的因子和 { int i; int sum = 0; for( i=1; i<n ; i++) if( n%i == 0 ) sum += i; return sum;

html5/css3响应式布局介绍及设计流程

html5/css3响应式布局介绍及设计流程,利用css3的media query媒体查询功能.移动终端一般都是对css3支持比较好的高级浏览器不需要考虑响应式布局的媒体查询media query兼容问题 html5/css3响应式布局介绍 html5/css3响应式布局介绍及设计流程,利用css3的media query媒体查询功能.移动终端一般都是对css3支持比较好的高级浏览器不需要考虑响应式布局的媒体查询media query兼容问题 一个普通的自适应显示的三栏网页,当你用不同的终端来查

5.20亲密数

Q:若整数A的全部因子(包括1,不包括本身)之和等于B,并且整数B的全部因子之和等于A,则称A与B是亲密数.求解3000以内的全部亲密数. 思路:先将1~3000以内所有数的全部因子之和算出来,存入到数组x[]中,这样x[i]中存放的是i的因子之和,寻找{1,2,--3000}范围中所有的亲密数的算法          如下: for(i=1;i<=3000;i++) //将1~3000所有数的因子和 放在一个数组x[1,2^3000]中 if(i没找到其亲密数,即i在集合B中) { for(j

亲密数对、递归求逆

/* * @Issue: 亲密数对问题:从键盘输入正整数 M 和 N(M<N),输出 M 和 N 之间所有的亲密数对. 亲密数对的定义如下:两个正整数 x 和 y,若 x 的所有因子之和(不包括 x 本身)等于 y, 并且 y 的所有因子之和(不包括 y 本身)等于 x,则 x 和 y 为亲密数对. * @Author: 一届书生 * @LastEditTime: 2020-02-21 10:04:41 */ #include<iostream> using namespace std;

响应式编程介绍

响应式编程简介 (原文) 你应该对响应式编程这个新事件有点好奇吧,尤其是与之相关的部分框架:Rx.Bacon.js.RAC等等. 在缺乏好的资源的情况下,学习响应式编程成为痛苦.我开始学的时候,做死地找各种教程.结果发现有用的只是极少部分,而且这少部分也只是表面上的东西,对于整个体系结构的理解也起不了多大的作用.直接去看那些库文档同样也理解不了.比如下面这个: Rx.Observable.prototype.flatMapLatest(selector, [thisArg]) Projects

HTML5 显式编排介绍

<!DOCTYPE html><html><head> <meta charset="UTF-8"> <title></title></head><body><h1>显式编排</h1><p>这里介绍显式编排</p><section> <h2>区块A</h2> <p>内容</p><

流式 storm介绍

Storm是什么 如果只用一句话来描述storm的话,可能会是这样:分布式实时计算系统.按照storm作者的说法,storm对于实时计算的意义类似于hadoop对于批处理的意义.我们都知道,根据google mapreduce来实现的hadoop为我们提供了map, reduce原语,使我们的批处理程序变得非常地简单和优美.同样,storm也为实时计算提供了一些简单优美的原语.我们会在第三节中详细介绍. 我们来看一下storm的适用场景. 流数据处理.Storm可以用来处理源源不断流进来的消息,

python高级内置函数和各种推导式的介绍:一行搞定的代码

一.知识要点 all 都为真 any 有真的 min 最小的 max 最大的 sum 求和 reversed 反转 sorted 排序 zip 对应合并 [] 列表推倒式 () 生成器 {} 字典推倒式 set 去重 if三元操作符 xx if x else y ennmerate 枚举,带索引 二. 代码 "1. all" # 参数为一个可迭代的对象(Iterable) m =[1, 2, 3, 4, ''] # 当然不是这样简答的使用 print(all(m)) def a1():