ShoneSharp语言(S#)的设计和使用介绍系列(4)— 入门概述
ShoneSharp语言(S#)的设计和使用介绍
系列(4)— 入门概述
作者:Shone
声明:原创文章欢迎转载,但请注明出处,https://www.cnblogs.com/ShoneSharp。
摘要: S#语言演变到如今,其实已经形成比较强的个性了,也有很多利弊。语言的个性是由其语法确定的,S#的基因就是公式系统,其设计、表达和核心库在各种语言比较中绝对算的上是一流的,已支持近3800个函数或属性或方法调用。
软件:S#语言编辑解析运行器(ShoneSharp.13.6.exe),运行环境.NET4.0,单EXE直接运行,绿色软件无副作用。网盘链接https://pan.baidu.com/s/1nv1hmJn
前面几篇博文发布后我发现各种搜索引擎很难索引到S#,应该是把#看成了特殊符号,因此我把标题改成“ShoneSharp语言(S#)的设计和使用介绍系列”,同时也突出了本系列还将介绍S#的语言设计过程与相关考量,可供语言设计爱好者参考。
今天开始就进入正题,对S#语言本身进行抽丝剥茧,详细介绍。
一、S#语言观
编程语言是人设计和使用的,因此不可避免也反应了人性,肯定会带有某些主观偏好和执念。有人的地方就有江湖,不同民族也有不同方言,可见编程语言的多样性也是必然。物以类聚,人以群分,持有类似编程语言观点的人在一起交流也会比较融洽,不过也没有必要党同划异、争论不休。
个人认为没有一种编程语言是完美的。每种语言都在走平衡木,在机器理性与人类感性世界里徘徊,在运行性能与开发效率中摇摆,在科学理论与工程现实夹缝中求生。
S#语言的开发不是为了替代谁谁,也不是为了显摆和牛逼,他是Shone个人爱好和探索的产物,也是语言自身不断进化的结果。S#语言演变到如今,其实已经形成比较强的个性了,要添加新的功能特性,很多情况下会产生排斥反应。
S#语言也有很多利弊。比如其特色是追求强大的表达能力,但是会牺牲一些运行性能;解析运行一体化很好,但是肯定不利于大规模程序的调试;万物皆树结构很酷,但是会多消耗一些内存。
S#语言不是大规模系统开发语言,但也是一种颇具特色的领域语言,因为他一开始就在内核层面支持二维三维的几何类型,因此天生就适用于表达图形,特别是参数化的矢量图形。
总之天下语言千千万,哪里有需求,哪个语言更适用就用那个。比如编写驱动程序肯定选C++/C/汇编,开发企业应用首选Java/.NET,Web应用就更多了。本人平时也还是使用C#做开发,定制图形系统时专门使用S#,公开S#也是想看看是不是有可能更多类似领域的应用,比如Grassshop、Dynamo等等。JavaScript一开始也只是浏览器语言,现在不也通过Node扩展到了服务器端了。
二、S#符号系统
编程语言其实就是个处理符号的系统,横看成岭侧成峰,远近高低各不同。
从不同角度和层次,S#语言都是进行了精心设计。
- 从机器角度看:S#处理的是数据,一切都是二进制符号,这是最原始的数据;
- 从用户角度看:S#处理的是字符,一切都是字节符号,开始有编码含义;
- 从词法层次看:S#处理的是单词,一切都是词法符号,开始有分词含义;
- 从语法层次看:S#处理的是节点,一切都是语法符号,开始有组合含义;
- 从语义层次看:S#处理的是标记,一切都是语义符号,开始有上下文含义;
- 从运行层次看:S#处理的是求值,一切都是信息符号,最终获得有意义的数据。
S#语言开始处理的是数据,最终获得的也是数据,从而形成周而复始的闭环。而其中处理的过程,其实就是数据变成信息的过程,也就是从没有意义的数据,变成有指定意义的数据(即信息)。
三、S#公式系统
语言的个性是由其语法确定的。S#从2007年开始开发,最初主要用于进行式解析,后面扩展支持了语句以及类,变成了全功能语言,但是在实现上其实公式系统和语句系统的表达能力是等价的,只是语法差异而已。
S#的基因就是公式系统。了解和学习S#,必然从基础的公式系统入手。这里自吹一句,S#公式系统的设计、表达和核心库在各种语言比较中绝对算的上是一流的,已支持近3800个函数或属性或方法调用,大家估算一下其开发工作量,可以用人年计算了。
S#公式由各种数据类型的常量、变量、运算符、函数、属性、方法等组合而成,并可以解析并计算得到一个相应数据类型的结果值,从而建立起变量和对象之间的逻辑依赖关系,确保在变量发生变化时相应的对象可以保持联动更新。
由于常量、运算符、函数、属性、方法数量很多,每个符号解释可以在编辑器软件中查阅,本文主要概述其含义、用途和方法,方便大家入门。后续章节还会逐一详解。
1) 类型
类型用于对各种不同数据进行分类,是S#公式进行解析和计算的基本要素。
S#语言支持的基础数据类型有如下几大类。
数值(即C#的double):用于表示整数或实数值,如10、25.32等。
字符串(即C#的string):用于表示文本内容,如"S#公式是很有特色"等。
布尔值(即C#的bool):用于表示是/否两种状态,如true、false等。
数组(即C#的类型化数组,如double[], string[], bool[]等):由相同类型的数据元素组成的一个数据序列,每种数据类型都可以有相应类型的数组。最常用的数组是数值数组如[10,20],还可以有其他的字符串数组如["红色","黄色","蓝色"]等。
列表(即C#的object[]的包装类):由相同或不同类型的数据元素组成的一个数据集合,集合中既可以包含基本数据、也可以包含数组、还可以包含其他列表,从而形成更加复杂的层级式数据结构,如{10,25.32,true,false,[10,20],["红色","黄色", "蓝色"],{1,2,{3,4}}}。
数据表(即C#的Dictionary<string,string>的包装类):其他语言也叫字典、或哈希表、或键值表,也是一种列表,只不过其中数据可以通过字符串直接索引。例如{A=5, B=[1,2], C={10,20,30}}。
二维几何:常用的有二维点如(10,10)、二维向量如<10,5>、二维线形如path(0,0,0,50,0,100,30)等。
三维几何:常用的有三维点如(10,10,5)、三维向量如<10,5,5>、三维面如plane3d((0,0,0),<1,1,1>)、道路中心线如roadway({[0,0,0,0,210], [195.535,141.294,124.927,210,0]},{[0,0,0],[195.535,30,0]},true,10,0,0,0)等。
2)常量
常量是系统预先定义的一些数值,如PI对应数值是3.1415926535897931。
大部分常量的表达和含义与C#相同,这是S#语言的偏好。
常量可以在编辑器中手工直接输入,也可以通过Ctrl+J组合键下拉选择框输入。
另外“常量”主菜单中还提供了常用π , ε , e , ∞ , true , false等符号的快捷输入。
3)变量
变量命名规则与各种程序语言类似,也是由字母、数字或_组合而成首字非数字的字符序列,如h1,width等。建议首字母采用小写,名称尽量精简而有含义,便于在建模过程中记忆和使用。变量有其相应的作用范围,即不同层级的变量只能在相应层级的定义范围内引用。
S#语言的默认定义范围偏好是:上级定义的变量对象可以被后续所有子级的对象引用,而在有重名变量时子级就近优先。
变量可以在编辑器中手工直接输入,也可以通过Ctrl+J组合键下拉选择框输入。
4)运算符
运算符是公式的基本表达方式,通过运算符可以对数值、常量、变量和子公式进行计算求值。常用的运算符有+-*/等,如(2*a+5*b)/c-10。
大部分运算符的表达和含义与C#相同,这是S#语言的偏好。
运算符通常由1~2个简单符号组成,可以在编辑器中手工直接输入。
S#支持在二位编辑页面中把公式展开并转换为可视化层次结构,从而让对应的运算符含义和公式逻辑结构更加直观,接近于科技论文中的数学公式表达方式。
5) 函数
函数调用是S#公式使用最为广泛的表达方式,其基本格式是:函数名称(参数,…)。其中每个参数又可以是一个子公式,从而可以形成更加复杂的公式嵌套结构。最常用的函数是数值函数,如sin(30)就是求正弦函数值。
大部分数值运算是通过小写函数调用,这是S#语言的偏好。
函数调用可以在编辑器中手工直接输入,也可以通过Ctrl+J组合键下拉选择框输入。注意在下拉选择框中输入字符时将自动高亮到最先匹配的条目,这时按下ESC键放弃,按下回车键则自动补全完整的函数名,而按下TAB键则自动补全完整的函数调用示例。如输入log后按TAB键则自动补全为log(10,2),然后再回过来修改参数,这对于有多个参数的函数可以减少记忆和输入的工作量。
S#除了各种语言都支持的一般函数意外,还支持功能更强大如几何函数、高级函数、函数定义等,其使用更复杂也更灵活,放在后续介绍。
6)属性
属性是面向对象的表达方式之一,可以方便表达被调用对象的各种相关信息,其基本格式是:对象.属性名称。
例如[10,20,30,40,50].Count表达的就是数组[10,20,30,40,50]的计数信息,计算结果为5。有的语言也可以采用函数替代属性如count([10,20,30,40,50]),但输入明显更加繁琐一点。
属性写法可以形成很有特色的链式写法,如A.B.C….,一直点下去,这也是S#语言的偏好。
属性调用虽然可以在编辑器中手工直接输入,但更常用的方法是通过按.键或Ctrl+J组合键下拉选择框输入。在下拉选择框中输入字符时将自动高亮到最先匹配的条目,这时按下ESC键放弃,按下回车键或TAB键则自动补全完整的属性名。
7)方法
方法也是面向对象的表达方式之一,可以方便表达针对被调用对象的各种操作,其基本格式是:对象.方法名称(参数,…)。
例如[10,20,30,40,50].Sub(2)表达的就是从数组[10,20,30,40,50]的索引2位置开始提取子数组,计算结果为[30,40,50]。有的语言也可以采用函数替代方法如sub([10,20,30,40,50],2),但输入会更加繁琐一点。
方法写法可以形成很有特色的链式写法,如A.B().C()….,一直点下去,这也是S#语言的偏好。
方法调用虽然可以在编辑器中手工直接输入,但更常用的方法是通过按.键或Ctrl+J组合键下拉选择框输入。与函数输入一样,在下拉选择框中输入字符时将自动高亮到最先匹配的条目,这时按下ESC键放弃,按下回车键或TAB键则自动补全完整的方法名,而按下TAB键则自动补全完整的方法调用示例。
声明:原创文章欢迎转载,但请注明出处,https://www.cnblogs.com/ShoneSharp。
软件:S#语言编辑解析运行器(ShoneSharp.13.6.exe),运行环境.NET4.0,单EXE直接运行,绿色软件无副作用。网盘链接https://pan.baidu.com/s/1nv1hmJn
posted on 2017-12-03 13:26 ShoneSharp 阅读(1574) 评论(6) 编辑 收藏 举报