scheme-langserver 新版本:scheme 社区第一个可实用的 gradual typing
今天,scheme-langserver( https://github.com/ufo5260987423/scheme-langserver)发布了一个最新版本 1.0.11 ,该版本中加入了 scheme 生态中第一个 gradual typing 实现。
以下内容摘自 scheme-langserver 的相关文档( https://github.com/ufo5260987423/scheme-langserver/blob/main/doc/analysis/type-inference.cn.md)(没找到oschina的markdown编辑功能,公式和详情请到原页面查看):
工程直觉:Scheme-langserver如何实现类型推断
包括Java和Typescript等编程语言都有一个类型系统, 能帮程序员尽可能避免代码执行中的错误。这些系统上基于遵循Hindley-Milner Type System或者System F的一些基本理论构建。然而,艰涩的理论不能保证它们的全知全能。
对scheme语言这样一种“非类型语言(untyped language)”,很多类型系统需要的信息并不能够轻易的从代码中找到:
(lambda (a) (+ 1 a))显然,这段代码无法显式给出参数
a
的类型。或者说,a
的类型是一个包含所有可能类型的全集something?
(后续会说明这是啥)。这是因为scheme语言不像许多其他语言一样在字面上给出函数的参数的类型。如果是Typescript,为了给a
标明类型number
:function(a: number){return 1+a}许多scheme语言的同类(比如Typed-racket)会改变它们的语法并且要求像Typescript这样的语言一样在字面上给出类型信息。但是,scheme-langserver认为可能有另外的手段——当下的大多数scheme代码都在尽量遵循r6rs标准,这意味着可以依据标准中给出的函数(或者按照lisp家族的术语来说,过程)所具有的语义来猜测类型信息。回归上面的那段scheme代码,我们有如下推导:
- 显然
+
是r6rs标准中规定的一个函数。- 一般公认这个函数的类型应该是
(number? <- (number? ...))
。其中<-
说明这是个函数的类型,它的左边是函数的返回值的类型,右边是函数的参数的类型列表。- 假定那段scheme代码能够正常运行,那么
a
的类型就可以确定为number?
。这个推导过程将帮助scheme-langserver找到隐含的类型信息并给出类型推导结果。本文将从如下几个反面进行介绍:
- 类型的表达式;
- 如何从代码收集类型推断的相关信息;
- 推断并得到结果;
- 用类型推断信息对代码进行诊断。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
wu-database-lazy-starter (1.2.0-JDK1.8-SNAPSHOT)
特性 强大的CRUD操作:内置通过注入 LazyLambdaStream 对象即可实现表单的大部分CRUD操作 支持Lambda形式的调用: 通过Lambda表达式,方便的编写各类查询条件 内置分页查询:通过构造分页对象查询数据统计分页总数 支持多种数据库:支持MySQL 支持数据库 任何能使用 LazyLambdaStream进行CRUD,并且支持标准SQL的数据库,具体支持情况如下 MySQL 代码托管 Gitee|Github 参与贡献 欢迎各位同学一起参与完善wu-database-lazy-starter 贡献代码:代码地址wu-database-lazy-starter,欢迎提交Issue或者Pull Requests 教程、案例、使用者名单 暂无 版本功能 Lazy-DB 是一款针对懒人快速开发的ORM框架 支持实体类反射数据进行数据库CRUD操作 新增灵性数据插入更新(自动过滤空值) 新增配置导出数据忽略指定字段 spring.datasource.ignore-exported-fields: - id 新增配置声明导出数据中的特殊字符 spring.datasour...
- 下一篇
全新数据库治愈框架 版本 1.2.0-JDK1.8-SNAPSHOT
描述 针对saas 数据库隔离情况下,每次版本迭代都需要重新修改对应的数据库,对于升级与运维存在一定的难度,那么这个数据库治愈框架来了,使用场景如下 1.数据库不存在自动创建数据库 2.运行时表不存在自动创建表 3.运行时字段不存在自动根据策略完善表字段 依赖安装 top.wu2020 wu-database-lazy-mybatis-cure-plus-starter latest 版本功能 新增支持针对mybatis数据库自愈 支持运行时表丢失自动创建表 支持运行时字段存在自动创建字段 配置 启动类添加扫描迭代数据库模型注解 @LazyScan(scanBasePackages = {"com.wu.smart.acw.core.domain.uo", "com.wu.framework.inner.lazy.example.**.entity"}) 字段添加模型注解 import com.wu.framework.inner.lazy.stereotype.LazyTableField; @LazyTable() // 表注...
相关文章
文章评论
共有0条评论来说两句吧...