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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...