热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Lite语言——从入门到放弃(二)

github.comkulicslite​这次我们来看看Lite的函数和结构设计。函数声明在Lite中,函数也是表达式,必须赋值给变量或常量,声明的格式为#(-){}#funct

github.com/kulics/lite

这次我们来看看 Lite 的函数和结构设计。

函数声明

在 Lite 中,函数也是表达式,必须赋值给变量或常量,声明的格式为

# (->) {} #
function : (->) {
# 函数逻辑 #
a = 1 + 1
}

这是一个没有参数也没有返回值的函数。

函数的调用方式和其它大部分语言一样。

# 调用 #
function()

参数

函数的参数定义与定义变量的方式一样,写在函数定义括号箭头前面部分,多个参数用逗号隔开。

# 声明参数 #
processInt : (x int, y int ->) {
a = x + y
}
# 调用传参 #
processInt(1, 2)

返回值

函数可以输出返回值,这样就可以将处理后的数据返回给调用者去使用。

函数的返回值定义与参数定义相同,不同的是写在函数定义括号箭头后面部分,多个返回值用逗号隔开。

返回语法表示为 <- value。

# 声明返回值 #
getInt : (-> x int, y int) {
# 返回数据 #
<- 1, 2
}
a, b = getInt()

函数类型参数

函数本身也存在类型,表示形式与声明的语法一致,只是不需要标识符和函数体。

通过这种方式可以将函数像数据一样传递,这样就可以把部分逻辑的实现交给外部定义。

doSomething : (x int ->) {
print(x)
}
# do 为函数类型参数 #
useFunction : (do (int->) ->) {
# 调用外部传入的函数 #
do(5)
}
# 传递函数 #
useFunction(doSomething)

Lambda 语法

除了传递函数名称,我们也可以直接创建匿名函数作为参数。

useFunction( (x int ->) {
print(x)
})

当然了,这种方式有点啰嗦。我们既然知道了函数的具体类型,就可以交给编译器去分析声明,用更简单的 Lambda 语法来帮我们声明函数。

# lambda语法为 { id -> expression } #
useFunction( { x ->
print(x)
})

嗯,简单多了。

如果这个函数只有一个函数参数,我们甚至可以省略外面的括号。

useFunction{ x -> print(x) }

这样就很棒了是不是?

判断lambda和循环lambda

Lite语言内置了部分常用的lambda语法,在某些场景下可以精简代码设计。
使用判断lambda可以简化一些传值代码,语法结构与判断语法一样,只需要函数标记 ?->

a = ?-> 1 + 1 == 2 {
5
} _ {
0
}
b = a ?-> 5 {
2
} _ {
3
}

使用循环lambda可以简化一些列表构造,语法结构与循环语法一样,只需要函数标记 @->

arr = i @-> 0..<5 {
i * 3
}
结构体

在 Lite 中,结构体是将一系列具有相同类型或不同类型的数据构成的数据集合。

结构体的声明格式为

# id := $ {} #
Cat := $ {
name str
age int
}

这样就把一个 name 字段和 age 字段包装在一个叫 Cat 的结构中,我们得到了一个新的类型 Cat,它就像 int 和 str 一样是一个可以被构建和传递的新数据类型。

我们不能直接使用 Cat 里面的属性,因为它只是一种类型的声明。我们需要通过实例化,构造出我们需要的独立数据。

# 构造表达式 type{} #
a = Cat{}

结构体内容调用

和其它语言一样,Lite 也通过 . 语法来调用结构体里面的内容。

a.name = "fish"
a.age = 10

结构体函数

函数也是数据,所以结构体也可以直接声明函数,如果需要调用自身,只是需要在前面附带一个参数标志符,表示它自身。

Cat := me $ {
miao : (->) {
print(me.name, me.age)
}
}

这样 Cat 类型就增加了一个 miao 函数,它一样可以被调用。

a.miao()

接口

接口是一种特殊的结构,它的定义形式类似于结构体,但是并不是用来包装数据,而是用来限定结构体必须包含的字段,用来对功能进行抽象,因此里面的内容只需要标志符和类型,不需要初始化。

接口的声明格式为

# id := % {} #
Pet := % {
getMaster (-> str)
}

这样就声明了一个 Pet 接口,它规定了对应的结构体必须实现 getMaster 函数。

这里的接口也是一个独立的类型,但这个类型只能用来抽象对应的结构体并且使用它们的功能,不能用来构造数据。

因此我们可以这样去使用接口

printMaster : (x Pet ->) {
print(x.getMaster())
}

就像使用一个结构体一样去使用它的内容。

实现接口

现在我们给 Cat 实现 Pet 接口,只需要在定义后面追加接口定义部分就可以了。

# 实现规定的函数 #
Cat := $ {
......
} % Pet {
getMaster : (-> name str) {
<- "Kulics"
}
}

现在我们就可以将 Cat 传递给 Pet 对象使用它了。

a = Cat{}
# 将 Cat 传递给 Pet #
printMaster(a)

结尾

以上是 Lite 函数、结构体和接口的基本语法,对比起其它语言的语法是否更简洁呢?
下一次我们会来看看如何用简洁的语法表达异常处理和异步处理。


推荐阅读
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
author-avatar
搞笑--林佳豪_533_654
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有