LogoSharp:Logo语言的C#实现
上周在朋友中問了一圈,發現沒有幾個人知道Logo語言的,或許,這門古老的語言現在用的人已經非常少了,除了國外有少量的用戶將Logo語言用于教育外,估計國內不會有人使用這門語言。其實,Logo語言本來也就是以編程教育為目的的一門寓教于樂的編程語言,因此,對于小朋友學計算機編程還是有些幫助的,使用Logo控制小海龜在屏幕上畫出各種美妙的圖案,可以讓小朋友對編程產生濃厚的興趣。
在90年代我剛剛接觸電腦的時候,當時國內比較流行的就是各種品牌的學習機,比較有名的有中華學習機、小霸王學習機、裕興電腦等。其中有些學習卡中就自帶LOGO繪圖語言,比如,裕興電腦的早期學習卡帶中就帶有LOGO語言:
在LOGO語言中,使用一些非常簡單的命令,就能夠繪制出非常漂亮的圖案。比如,執行以下指令:
這段指令的意思是,讓小海龜向前爬行100步,然后向右旋轉144度,以此重復5次,就畫出了一顆五角星。有關LOGO語言的詳細介紹,可以參考百度百科相關介紹。
出于興趣以及對童年的回憶,我使用C#語言,基于Irony語法解析器生成框架,實現了LOGO語言的語法解析和執行系統:LogoSharp。于是,我可以在自己的應用程序中使用LogoSharp來實現LOGO程序的執行,并控制海龜實現圖形繪制:
LogoSharp基于MIT協議開源,地址是:https://github.com/daxnet/logo-sharp。我也將其封裝成NuGet包,可以在.NET Framework以及.NET Core下直接使用。首先,將LogoSharp NuGet包添加到自己的項目中,注意,目前是Preview的版本,所以,如果使用Visual Studio中的NuGet界面,需要勾選Include prerelease的復選框。如果使用Package Manager Console,那只要敲入命令就行了:
1 | Install-Package LogoSharp -Version 0.9.20-preview |
然后,在你的應用程序中使用LogoSharp:
1 2 3 4 5 6 7 | static void Main(string[] args) { ????var logo = new Logo(); ????logo.Forward += (s, e) ????????=> Console.WriteLine($"Forwarded {e.Steps} steps."); ????logo.Execute("FD 102"); } |
LogoSharp開發框架本身是基于事件的,也就是,只要有控制小海龜動作的指令被執行,就會產生一個對應的事件,比如上面的代碼中,執行FD 102指令時,就會產生一個Forward事件,表示此時需要讓小海龜向前走102步,在這個演示代碼中,Forward事件處理函數就會將前進步數輸出到控制臺。
在LogoSharp的源代碼中,有一個測試程序,就是上面動圖所演示的這個程序,它是一個Windows Forms的應用程序,它就是訂閱了LogoSharp產生的事件,然后控制小海龜的運動,并通過GDI+在指定的窗體上繪制圖形。
目前,LogoSharp支持以下功能:
語言特性
變量的定義與使用
MAKE指令
局部變量與全局變量
表達式
一元表達式(Unary Expression)
二元表達式(Binary Expression)
常量表達式(Constant Expression)
函數調用表達式(Function Call Expression)
過程(TO … END程序結構)
函數調用
平方根函數(SQRT)
隨機函數(RANDOM)
內聯注釋行,使用分號(;)作為注釋起始符
基本行為控制命令
PENDOWN/PD:下筆,此時移動海龜,會進行線段繪制
PENUP/PU:提筆,此時移動海龜,不會進行繪制
SETPENCOLOR/SETPC/PC:設置線條的顏色
SETPENSIZE:設置線條的粗細
PENERASE/PE:設置下筆行為為擦除行為
PENNORMAL/PN:設置下筆行為為繪制行為
基本繪制命令
LEFT/LT:向左旋轉
RIGHT/RT:向右旋轉
FORWARD/FD:向前步進
BACKWARD/BK/BACK:向后倒退
DELAY:海龜行為間隔延遲,單位:毫秒
DRAW/CLS/CLEARSCR/CLEARSCREEN/CS:清除屏幕內容
海龜控制命令
HOME:海龜歸位到屏幕中心
SHOWTURTLE/ST:將海龜顯示在屏幕上
HIDETURTLE/HT:將海龜隱藏起來
流程控制命令
REPEAT:重復執行,支持RepCount內部參數,用于指代當前的迭代數
目前LogoSharp還有很多可以完善的地方:
IF/WHILE語句暫不支持,但很快會支持
目前不支持一條語句分行編寫,造成的結果是,有可能一條語句會寫得很長
除了上面列表中的命令,其它命令暫不支持,不過今后也會陸續加入
不支持布爾值和布爾表達式以及邏輯操作
內置函數調用需要用花括號括起來,比如:{SQRT 2}。主要是因為函數調用本身是表達式,而其參數列表也是表達式,那么,如果不用括號這樣的界定符括起來,語法上就會出現二義性。比如:hello world 2,你可以說hello是調用函數的函數名,它有兩個參數:world和2,也可以說hello是一個沒有參數的函數調用,而world是另一個函數,它的參數為2
此外,今后也會加入更多的內建函數,并使得函數擴展更為方便。
LogoSharp是一個非常有趣的項目,今后我會進一步做一些擴展,比如豐富函數庫以及提供更好的編程環境等。后續我也會介紹一些有關Irony語法解析器生成框架的內容,以及LogoSharp實現中遇到的一些有趣的問題及其解決辦法。
原文地址:https://sunnycoding.cn/2019/07/09/logo-sharp-csharp-implementation/
.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總?http://www.csharpkit.com?
總結
以上是生活随笔為你收集整理的LogoSharp:Logo语言的C#实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 容器化单页面应用中RESTful API
- 下一篇: Hello Kubernetes快速交互