上周在朋友中问了一圈,发现没有几个人知道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#实现相关推荐

  1. 芜湖市计算机语言,2012年芜湖市小学计算机水平等级测评试卷(logo语言版)

    2012年芜湖市小学计算机水平等级测评试卷 (LOGO语言卷) 题号 一 二 三 四 总分 得分 温馨提示:本试卷有四大题,共8页.考试时间120分钟,满分120分. 一.填空题(每空1分,共20分) ...

  2. 计算机教室logo,小学信息技术LOGO语言教学法.doc

    精品文档(可编辑) 值得下载 小学信息技术LOGO语言教学法 摘 要:泰山版小学信息技术教材中的LOGO语言是针对儿童而制作的一种较为简单的编程语言,主要用于"图画"制作,并且采用 ...

  3. 芜湖小学生计算机水平等级测试竞赛,[转载]2012年芜湖市小学计算机水平等级测评试卷(logo语言版)...

    2012年芜湖市小学计算机水平等级测评试卷 (LOGO语言卷) 题号 一 二 三 四 总分 得分 温馨提示:本试卷有四大题,共8页.考试时间120分钟,满分120分. 一.填空题(每空1分,共20分) ...

  4. 还记得Logo语言吗

    其实当年在做关于GDI+和.Net WinForm控件开发的时候,一时兴起,就顺便用GDI+和一些简单的编译原理知识做了一个用于Logo语言开发的小工具(解释运行).(请参考刚学GDI+和.Net W ...

  5. 厦门2017计算机考试题目,2017年厦门市小学生计算机LOGO语言竞赛(初赛)试卷

    2017年厦门市小学生计算机LOGO语言竞赛(初赛)试卷 (发布人:庄岩 最后更新时间:2017-12-20 11:02 发布时间:2017-12-20 10:32 点击量:13377) 一.选择题( ...

  6. 计算机小学知识竞答,小学生计算机LOGO语言竞赛试卷附答案

    参赛须知 1.本竞赛用时为90分钟. 2.答案依[]框中所示标号填写在答题卷上,考试结束时只交答题卷. 3.需要画图时可用铅笔和规尺,图形要求形状和比例基本相似即可,重叠的线只画一条. 一.选择题(每 ...

  7. 在计算机语言中的乘法,LOGO语言编程题  高精度乘法★★

    不限制位数的整数高精度乘法★★★★ 这是"高精度算法"系列文章中的第二篇.在"高精度加.减.乘.除"这4种计算中,加法最基础.最简单,乘法稍难,减法更难,除法最 ...

  8. logo语言linux,用 screenfetch 和 linux_logo 显示带有酷炫 Linux 标志的基本硬件信息

    想在屏幕上显示出你的 Linux 发行版的酷炫标志和基本硬件信息吗?不用找了,来试试超赞的 screenfetch 和 linux_logo 工具. Linux Logo 来看看 screenfetc ...

  9. C语言编写Scheme解释器,C语言编写logo语言解释器 ,求高手指导

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 definition: data types: Boolean 取值 true或false number interger或floating point ...

最新文章

  1. BF算法优化-------KMP算法
  2. x-pack watch邮件报警配置
  3. 使用Python命令创建jenkins的job
  4. 【android-tips】installfailedinsufficientstorage解决方案
  5. python引入jit_从numba导入jit
  6. 解决ntp的错误 no server suitable for synchronization found
  7. BZOJ1324Exca王者之剑BZOJ1475方格取数——二分图最大独立集
  8. 借助阿里AntUI元素实现两个Web页面之间的过渡——“Loading…”
  9. java oop试题_java oop 试题
  10. 学会人工智能可以从事哪些行业?
  11. 201803101101_《函数的原始写法》
  12. 关于母板页中runnat=server 窗体标记的问题
  13. edius多机位多轨编辑
  14. D4.8 Write transactions
  15. javascript案例26——求100以内所有7倍数之和
  16. 如何在android中设置背景图片,在Android中设置窗口背景图
  17. 城市交通大数据及智能应用
  18. 谷歌浏览器下图片缩放模糊失真
  19. OpenCL专题04:ViennaCL与Eigen双剑合璧
  20. python判断奇数和偶数_从Python中的给定列表中提取偶数和奇数

热门文章

  1. 在Teams中对网站的URL特殊解析
  2. 定时插座动一下就断_使用插座定时器在某些时候自动将您的Amazon Echo静音
  3. wepy学习笔记之环境搭建
  4. 原生sql实现restful接口调用
  5. Software License Manager
  6. UITabBarController的基本原理及使用(一)
  7. 微服务太分散?使用Fundebug集中式bug监控
  8. Android GIS开发系列-- 入门季(13)Gdal简单写个shp文件
  9. @Springboot搭建项目controller层接收json格式的对象失败
  10. 数据库设计-基础-1-教务科研申报系统设计UML用例图