ShoneSharp語言(S#)的設計和使用介紹系列(10)— 富家子弟“語句“不炫富

来源:http://www.cnblogs.com/ShoneSharp/archive/2017/12/21/ShoneSharp-10.html
-Advertisement-
Play Games

語句是過程式編程語言的基礎構造,對應於程式命令,通常按照指定順序執行。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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 這一篇博文拖了蠻久了,現在先把它完成,結束struts2這個版塊,當然這隻是最基礎的部分,做項目還需要更深的理解。下一個web後端的版塊準備做Spring框架的學習~嗯,加油! 目錄: 國際化思想 Struts2中載入全局資源文件 國際化信息輸出 properties文件配置 1. 具體內容 1.1 ...
  • 輸入兩個整數lower和upper,輸出一張華氏-攝氏溫度轉換表,華氏溫度的取值範圍是【lower,upper】,每次增加1°F,計算公式如下: ...
  • 蒟蒻連續一個多月沒寫題,發現連很簡單的題都不會寫了,以前學的都忘了,所以還是寫博客記錄一下吧。 ...
  • 安裝:pip instatll Twisted-17.9.0-cp36-cp36m-win_amd64.whl 錯誤:Twisted-17.9.0-cp36-cp36m-win_amd64.whl is not a supported wheel on this platfor m. 解決方法:修改 ...
  • 對數據的添加: 對數據的修改: $data = I('post.'); D('Leave')->Approver = $data['Approver']; D('Leave')->where("id={$data['id']}")->save(); 對數據的查詢: ...
  • 小知識點總結 一、Python2與Python3 的區別 1、Python2中可以加括弧輸出,也可不加輸出 Python3中必須加 2、python2 中有xrange(生成器)也有range python3中只有range 3、python2中的input為raw_input python3 中為 ...
  • 其實是:jsonmappingexception:no serializer found for class 由於後臺錯誤堆棧列印很快,只看到illegalStateException:stream 需要細心調試debug. 原因:與response 的geOutputStream out.getW ...
  • 很長一段時間以來,我都在思考如何在ASP.NET Core的框架下,實現一套完整的事件驅動型架構。這個問題看上去有點大,其實主要目標是為了實現一個基於ASP.NET Core的微服務,它能夠非常簡單地訂閱來自於某個渠道的事件消息,並對接收到的消息進行處理,於此同時,它還能夠向該渠道發送事件消息,以便... ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...