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代码,我们有如下推导:

  1. 显然+是r6rs标准中规定的一个函数。
  2. 一般公认这个函数的类型应该是(number? <- (number? ...))。其中<-说明这是个函数的类型,它的左边是函数的返回值的类型,右边是函数的参数的类型列表。
  3. 假定那段scheme代码能够正常运行,那么a的类型就可以确定为number?

这个推导过程将帮助scheme-langserver找到隐含的类型信息并给出类型推导结果。本文将从如下几个反面进行介绍:

  1. 类型的表达式;
  2. 如何从代码收集类型推断的相关信息;
  3. 推断并得到结果;
  4. 用类型推断信息对代码进行诊断。

相關推薦

2023-11-23

Scheme-langserver是一款面向scheme语言的语言服务器,它基于LSP协议(Language Server Protocol)提供了自动补全(auto-complete)、寻找变量定义(goto definition)等功能。 11月21日,scheme-langserver发布了类型推断功能,并将该功能整合进入了

2023-08-24

中提出的宝贵反馈与建议。后续我们会撰写更多 KCL v0.5.x 新版本功能解读系列文章,敬请期待! 更多其他资源请参考: KCL 网站 KusionStack 网站 KCL 2023 路线规划 KCL v0.6.0 Milestone KCL Github Issues KCL Github Discussion K

2022-11-01

证 类似 Hugs 的交互环境 主要变化 引入新的基于 Scheme 的实验性 evaluator(只有在通过 Chez scheme 或 Racket 编译时才可以使用)。如需在 REPL 中访问此功能,使用:set eval scheme将 evaluator 模式设置为基于 Scheme 的 evaluator。 引

2023-11-14

无法回显问题,fix #14713 #13822 React-Native 修复新版本的 react native screen 编译不过的问题 Typings 添加原图成像质量 type 补充配置 enableSourceMap 类型 更新 location 类型 更新数据分析及数据缓存 API types cli-convertor

2022-04-02

Mac 的扩展稳定频道。这将在未来几天/几周内推出。” 新版本的众多变化包括有: 更新 cookie 字符串的解析以允... 本文转载自《Go+ 下个里程碑:超越 cgo,无缝对接 C 语言》,作者许式伟(@xushiwei)是七牛云创始人兼 CEO,创造

2023-06-01

Bootstrap v5.3.0 的稳定版本正式发布,新版本带来的变化包括: 支持黑暗模式 Bootstrap 的核心已被重写,为黑暗模式提供了支持。此外,Bootstrap 现在支持任何数量的颜色模式,允许你建立自己的自定义主题或更细微的颜色模式

2023-10-25

苏州源创会,一起寻宝 AI 时代 KubeEdge 发布 v1.15.0 版本。新版本新增多个增强功能,在边缘节点管理、边缘应用管理、边缘设备管理等方面均有大幅提升。 KubeEdge v1.15.0 新增特性: 支持 Windows 边缘节点 基于物模型的新版本

2024-07-30

架、系统安全、人工智能等多个技术方向;平台侧,社区新版本论坛平台上线、小程序新增在线会议记录功能模块、并更新平台内容模块10+;版本侧,发布了openKylin 2.0 Beta、openKylin 2.0 Beta2和openKylin 2.0 RC版本,并举办公测活动收

2023-07-05

激光笔的光标处理机制,减少异常情况 优化适配 Typora 新版本对无效页内链接检查机制 ⚠️ — What's CHANGED — ⚠️ 移除标签、徽章、引用、刮刮卡、注音对旧语法的支持 简化表格列格式「复选框」语法,方括号

2023-08-11

装与 KCL 任何相关的组件,只需本机具备 Helmfile 工具的最新版本即可。 我们可以编写一个如下所示 helmfile.yaml 文件 repositories: - name: prometheus-community url: https://prometheus-community.github.io/helm-charts releases: - name: prom-norbac-ubuntu namespac

2022-12-14

thub托管仓库: https://github.com/dromara/liteflow v2.9.5介绍 新版本我们完成了9个issue,其中包含着3个特性。 2.9.5版本的重点是横向扩展能力。 至此,LiteFlow在存储插件上原生支持了所有的关系型数据库,3种流行注册中心,1个配

2022-11-30

经有数月之久,在这一期间,我们重新思考并确立了社区新版本发布的流程,正式引入了 LTS (Long-Term Support,长周期支持)版本的概念,在 1.1.x 系列版本中不再引入大的功能 Feature、仅提供问题修复和稳定性改进,力求满足更

2023-04-16

能依靠配置文件的改变,可以说是功能及其单一,但是在新版本中,添加了多厂商支持和并用,同时配置方式也发生了变化 sms: alibaba: #阿里云的accessKey accessKeyId: 您的accessKey #阿里云的accessKeySecret accessKeySecret: 您的accessKeySecret

2023-07-17

题 4.修复GRUB主题无法装载的问题 5.优化“welcome”程序 新版本ISO光盘镜像文件大小:1.72G 版本类型:Beta 发布时间:2023-07-16 07:31:2 注:官网提供三种校验文件的下载 官网:LingmoOS - 灵墨操作系统 Gitee:LingmoOS: Lingmo GNU/Linux