ShoneSharp语言(S#)的设计和使用介绍系列(4)— 入门概述
ShoneSharp语言(S#)的设计和使用介绍
系列(4)— 入门概述
作者:Shone
声明:原创文章欢迎转载,但请注明出处,https://www.cnblogs.com/ShoneSharp。
摘要: S#语言演变到如今,其实已经形成比较强的个性了,也有很多利弊。语言的个性是由其语法确定的,S#的基因就是公式系统,其设计、表达和核心库在各种语言比较中绝对算的上是一流的,已支持近3800个函数或属性或方法调用。
软件: S#语言编辑解析运行器,运行环境.NET 4.0,绿色软件,单个EXE直接运行,无副作用。网盘下载链接为https://pan.baidu.com/s/1dF4e08p
前面几篇博文发布后我发现各种搜索引擎很难索引到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#语言编辑解析运行器,运行环境.NET 4.0,绿色软件,单个EXE直接运行,无副作用。网盘下载链接为https://pan.baidu.com/s/1dF4e08p
ShoneSharp语言(S#)的设计和使用介绍系列(4)— 入门概述的更多相关文章
- ShoneSharp语言(S#)的设计和使用介绍系列(1)— 开篇
ShoneSharp语言(S#)的设计和使用介绍 系列(1)- 开篇 作者:Shone 声明:原创文章欢迎转载,但请注明出处,https://www.cnblogs.com/ShoneSharp. 一 ...
- ShoneSharp语言(S#)的设计和使用介绍系列(3)— 修炼工具
ShoneSharp语言(S#)的设计和使用介绍 系列(3)- 修炼工具 作者:Shone 声明:原创文章欢迎转载,但请注明出处,https://www.cnblogs.com/ShoneSharp. ...
- ShoneSharp语言(S#)的设计和使用介绍系列(2)— 掀开盖头
ShoneSharp语言(S#)的设计和使用介绍 系列(2)- 掀开盖头 作者:Shone 声明:原创文章欢迎转载,但请注明出处,https://www.cnblogs.com/ShoneSharp. ...
- ShoneSharp语言(S#)的设计和使用介绍系列(11)—“类”披炫服靓妆化成“表”
ShoneSharp语言(S#)的设计和使用介绍 系列(11)—“类”披炫服靓妆化成“表” 作者:Shone 声明:原创文章欢迎转载,但请注明出处,https://www.cnblogs.com/Sh ...
- ShoneSharp语言(S#)的设计和使用介绍系列(10)— 富家子弟“语句“不炫富
ShoneSharp语言(S#)的设计和使用介绍 系列(10)— 富家子弟“语句“不炫富 作者:Shone 声明:原创文章欢迎转载,但请注明出处,https://www.cnblogs.com/Sho ...
- ShoneSharp语言(S#)的设计和使用介绍系列(9)— 一等公民“函数“爱炫巧
ShoneSharp语言(S#)的设计和使用介绍 系列(9)— 一等公民“函数“爱炫巧 作者:Shone 声明:原创文章欢迎转载,但请注明出处,https://www.cnblogs.com/Shon ...
- ShoneSharp语言(S#)的设计和使用介绍系列(8)— 最炫“公式”风
ShoneSharp语言(S#)的设计和使用介绍 系列(8)— 最炫“公式”风 作者:Shone 声明:原创文章欢迎转载,但请注明出处,https://www.cnblogs.com/ShoneSha ...
- ShoneSharp语言(S#)的设计和使用介绍系列(7)— 布尔Bool及对象Object
ShoneSharp语言(S#)的设计和使用介绍 系列(7)— 布尔Bool及对象Object 作者:Shone 声明:原创文章欢迎转载,但请注明出处,https://www.cnblogs.com/ ...
- ShoneSharp语言(S#)的设计和使用介绍系列(6)— 字符串String
ShoneSharp语言(S#)的设计和使用介绍 系列(6)— 字符串String 作者:Shone 声明:原创文章欢迎转载,但请注明出处,https://www.cnblogs.com/ShoneS ...
随机推荐
- Java 7 JVM和垃圾收集
---恢复内容开始--- 写JAVA程序,一定要了解JVM(JAVA Virtual machine)一些基础知识和垃圾收集.如果对JVM已经很了解了,可以不用继续往下阅读了.本文只针对Java 7, ...
- GoldenGate 复制进程报错"OGG-01296 Error mapping",丢弃文件报错“Mapping problem with delete record (target format)”,且实际条目存在
故障描述: (1).复制进程 Abended,通过view report语句查看可发现类似如下的报错: 2017-10-23 15:01:43 ERROR OGG-01296 Error mappin ...
- 树莓派.使用Node.js控制GPIO
树莓派上的40个GPIO是最好玩的东西 它们可以被C,/C++, Python, Java等语言直接控制 现在就来看看怎么用Node.js做到同样的事情 在试验之前, 请先安装好Node.js, 具体 ...
- Robot Framework自动化测试框架初探
Robot Framework是一款python语言编写,通用的功能自动化测试框架.它使用了比较易用的表格数据语法,基于关键字驱动测试,主要用来验收测试和验收测试驱动开发(ATDD). 本文主要介绍R ...
- 无所不会的fiddler遇到的尴尬
昨天测试项目时,遇到一个尴尬的事 预期功能:点击页面某个按钮会post2个请求 实际情况:点了按钮,fiddler抓包没有看到任何请求 后来经过他人提醒在PC端浏览器打开此页面,点击按钮后看到页面有j ...
- (function($){...})(jQuery)和$(document).ready(function(){}) 的区别
(function($){...})(jQuery) 实际上是执行()(para)匿名函数,只不过是传递了jQuery对象. 立即执行函数:相当于先申明一个函数,声明完后直接调用: 用于存放开发 ...
- Problem W
Problem Description Speakless很早就想出国,现在他已经考完了所有需要的考试,准备了所有要准备的材料,于是,便需要去申请学校了.要申请国外的任何大学,你都要交纳一定的申请费用 ...
- pandas数据结构练习题(部分)
更多函数查阅http://pandas.pydata.org/pandas-docs/stable/10min.htmlimport pandas as pd#两种数据结构from pandas im ...
- appendChild方法详解
方法:target.appendChild(ele); 执行该方法时,会发生两部操作: 1.将元素ele从原来的父元素中移除掉 2.将元素追加至新的目标元素中,并且保留元素的所有样式信息和事件... ...
- .Net中的装箱和拆箱
装箱(boxing)和拆箱(unboxing)是.NET提出得新概念!.NET的所有类型都是由基类System.Object继承过来的,包括最常用的基础类型:int, byte, short,bool ...