語句是過程式編程語言的基礎構造,對應於程式命令,通常按照指定順序執行。S#語句與C#語句基本相同,如有var, eval, if, switch, for, foreach, do, while, return, continue, break, load, using等語句。C/C++/Java/... ...
ShoneSharp語言(S#)的設計和使用介紹
系列(10)— 富家子弟“語句“不炫富
作者:Shone
聲明:原創文章歡迎轉載,但請註明出處,https://www.cnblogs.com/ShoneSharp。
摘要: 語句是過程式編程語言的基礎構造,對應於程式命令,通常按照指定順序執行。S#語句與C#語句基本相同,如有var, eval, if, switch, for, foreach, do, while, return, continue, break, load, using等語句。C/C++/Java/JavaScript等語言愛好者很容易上手。
軟體: S#語言編輯解析運行器13.6.24,運行環境.NET 4.0,綠色軟體,單個EXE直接運行,無副作用。網盤下載鏈接為https://pan.baidu.com/s/1nv1hmJn
今天繼續介紹S#的語句功能,請使用最新軟體13.6.24版運行本文示例。
語句是過程式編程語言的基礎構造,對應於程式命令,通常按照指定順序執行。語句執行順序通常也稱為“控制流”。
S#語句的語法與C#基本上相同,為了突出S#的表達能力做了部分精簡,如刪去事件、委托、屬性修改、非同步等,因為S#是面向表達的動態語言,不需要開發成為另一個C#。
S#語句就像來自C#大家族是富家子弟,平常比較低調不炫富,主要使用公式就可滿足要求,需要時也可以寫出像C#一樣複雜的大塊邏輯代碼。S#語句也適合於有C / C++ / Java / JavaScript等C類風格編程語言愛好者上手試用。
一、基本語句
(1)聲明語句:聲明引入新的變數,併為變數賦值。
var 變數名 = 變數值公式;
var變數聲明語句例如:
var a = 10; //聲明數值變數,若未定義則新聲明一個,否則修改已定義變數 var f = func(x, y)=>(x+y)/2; //聲明函數變數
func 函數(參數序列) = 變數值公式;
func函數聲明語句例如:
func f(x, y) = (x+y)/2; //顯式聲明函數變數,與上面var聲明等價,但更直觀 func f(x=10, y=20) = (x+y)/2; //顯式聲明函數變數,帶預設值
(2)表達式語句:用於調用函數、對象方法、或修改變數值的語句。
表達式;
例如:
Funcxxx(); //執行函數調用 xxx.Methodxxx(); //執行對象的方法調用 (x+y)/2; //其他任意表達式加;也是合法語句,通常用於求值語句
變數名 符號 變數值公式;
例如:
x += 10; x -= 10; x *= 10; x /= 10; x /%= 10; x %= 10; x ^= 10; x += 10; x++; x--;
(3)返回值語句:用於返回結果值的語句。
return 結果值公式;
(4)跳轉繼續語句:用於跳轉並繼續迴圈體控制流的語句,即繼續迴圈。
continue;
(5)跳轉結束語句:用於跳轉並結束迴圈體控制流的語句,即跳出迴圈。
break;
二、語句塊
語句塊可以是單個語句,也可以由{}包圍的一個到多個語句序列。
單語句
{ 語句系列 }
語句塊通常用於複合語句中,並通過語句塊可以形成複雜的嵌套語句結構。
三、求值語句
與其他語言不同,S#多了一個求值語句,即獨立的帶{}的語句塊。
求值語句用於按照順序執行對應控制流並最終返回一個結果值的語句。執行時遇到return語句則結束控制流並返回該語句結果,如果沒有return語句則執行到最後一個語句再返回最有一個語句的計算結果。例如:
{ var x = 10; var y = 20; (x + y) / 2; } //計算結果為最後一個語句值,即15
另一個帶return語句例子:
{ var x = 10; var y = 20; if(x<y) return 50; return (x+y)/2; } //計算結果為第一個return語句值,即50
細心的觀眾可能會發現求值語句與eval()公式功能類似,都是設置局部變數,返回一個結果值,只不過支持更多語法結構和組合,功能更強。求值語句還可以直接嵌套在公式中使用,這時需要加上eval關鍵字,例如:
5 + eval{var x=5; return 2*x;} //計算結果15
三、複合語句
(1)選擇語句:用於進行條件判斷並選擇執行對應控制流的語句。
if(條件公式) 語句塊1
if(條件公式) 語句塊1 else 語句塊2
選擇語句先計算條件公式併進行判斷,如果為真則執行語句塊1,否則執行語句塊2。例如:
{ var a=15; var b=0; if(b<a) b=a; if(a<10) a+=100; else a-=10; return a+b; } //計算結果20
(2)分支語句:用於多路分支比較判斷並選擇執行對應控制流的語句。
switch(數據公式) { 分支語句系列 預設語句 }
分支語句寫法是:case 分支公式: 語句系列
預設語句寫法是:default: 語句系列
分支語句先計算數據公式,然後對分支語句的每個分支進行測試,如果等於某個分支公式值,則執行該分支語句,否則執行預設語句。註意case語句塊的最後一個語句通常是break;例如:
{ var a = 2; var x = 0; switch( a ) { case 1 : x = 10; break; case 2 : x = 20; break; default: x = 30; break; } return x; } //計算結果20
(3)迴圈語句:用於迴圈進行條件判斷並執行對應控制流的語句。
for(變數賦值語句; 迴圈條件公式; 步長賦值語句) 迴圈體語句塊
例如:
{ var a = [ 10 , 20 , 30 ]; var x = 0; for(var i = 0 ; i < 3 ; i++ ) { x += 2*a[ i ]; } return x; } //計算結果120
foreach(var 變數名 in 數組或列表公式) 迴圈體語句塊
例如:
{ var a = [ 10 , 20 , 30 ]; var x = 0; foreach(var b in a ) { x += 2 * b; } return x; } //計算結果120
while(迴圈條件公式) 迴圈體語句塊
例如:
{ var a = [ 10 , 20 , 30 ]; var x = 0; var i=0; while(i < 3) { x += 2*a[ i ]; i++; } return x; } //計算結果120
do迴圈體語句塊 while(迴圈條件公式);
例如:
{ var a = [ 10 , 20 , 30 ]; var x = 0; var i=0; do { x += 2*a[ i ]; i++; }while(i<3); return x; } //計算結果120
四、整合語句
(1)動態載入.NET程式集:動態載入指定的.NET dll到當前程式域中,後續語句就可以通過全名直接調用該dll公開的方法。
load 文件名稱字元串;
假如你已經用C#編寫了一個叫AddIn.dll的.NET程式集,包含有一個名叫Shone的類及相關方法如下:
using System; namespace MyAddIn { /// <summary> /// 示例擴展 /// </summary> public class Shone { /// <summary> /// 測試函數,返回兩個數值和的一半 /// </summary> public static double Mid(double d1, double d2) { return (d1 + d2) / 2; } } }
那麼你就可以執行以下S#語句調用其中.NET方法進行計算了:
{ load 'C:\Hjx\AddIn.dll' //載入.NET dll文件 var a=10; var b=20; MyAddIn.Shone.Mid(a,b); //計算結果15 }
通過這種方式可以非常輕易地進行擴展,一些複雜的計算或邏輯處理直接用.NET寫成dll,使用S#調用即可。如果你有C++代碼的.NET包裝dll,那麼你也可以通過這種動態載入,從而間接調用C++代碼。
事實上S#預設就動態載入了.NET的system.dll,因此System命名空間中的很多方法可以直接調用。例如:
{ var a = PI/3; var b = 60; System.Math.Cos(a)+cos(b); //計算結果0.5+0.5=1 } //註意:.NET的Cos方法參數為弧度,系統cos函數參數為角度
這會很酷炫,很像Python可作為膠水語言,只是S#天生就與.NET無縫融合在一起。
(2)使用命名空間:在當前變數堆棧上引用.NET命名空間的子命名空間、或類型中的所有成員,後續語句就可以不用全名直接調用該dll公開的方法。
using 命名空間或類型名稱;
如上述例子可以通過using語句簡化寫成如下:
{ load 'C:\Hjx\AddIn.dll' //載入.NET dll文件 using System.Math; using MyAddIn.Shone; var a=10; var b=20; Mid(a,b)+Cos(PI/3); //計算結果15.5 }
註意使用上using語法與C#類似,但背後原理差別很大,其實S#中命名空間、類型、方法以及函數都看成變數了,優點是動態性和靈活性更大,缺點是類型推導難了,也容易出現重名,這就是硬幣的兩面性。
五、語句綜合示例
下麵舉一個比較複雜的語句例子:
{ var str = ""; for(var i = 0 ; i < 5 ; i++ ) { for(var j = 4 ; j > i ; j-- ) { str += " "; } for(var t = 0 ; t <= i ; t++ ) { str += "*"; } for(var p = 0 ; p <= i - 1 ; p++ ) { str += "*"; } str += "\r\n"; } return str; }
//輸出結果*的三角堆字元串,看起來效果如下
*
***
*****
*******
*********
六、待擴展
很多語言的學習都是從輸出Hello開始的,其實S#現在就有該功能,不信寫下如下句子:
{ System.Console.Write("您好!"); }
是不是和C#的入門程式很像。只不過是Write方法的返回值為null,"您好!"被寫到控制臺中,目前看不到,後面我會想辦法打開控制台,需要時可以隨時看到控制台內容。
六、展望
語句其實是為後面更複雜的代碼模塊——“類”使用的,有待後續分解。
目前而言,語句通過eval{}可以嵌入到前述的公式中,就可以形成很多語言難以達到的靈活性和複雜性了。
不知您對S#的語句能力評價如何?
聲明:原創文章歡迎轉載,但請註明出處,https://www.cnblogs.com/ShoneSharp。
軟體: S#語言編輯解析運行器13.6.24,運行環境.NET 4.0,綠色軟體,單個EXE直接運行,無副作用。網盤下載鏈接為https://pan.baidu.com/s/1nv1hmJn