这篇文章是为Racket Advent Calendar的第 8 天而写。“#lang”是 Racket 中用于声明使用的编程语言的术语,本文以 Racket 为平台讨论编写良好编程语言的一种方法。
主要观点:
- 当表达复杂想法的方式变得足够小且易于记忆时,它就成为了一种语言,如 Racket 的模块系统。
- 对比 Racket 的模块系统和其他语言的异常处理机制,指出后者不实用,而 Racket 可利用基本原语构建自己的异常语言。
- 介绍在 Racket 社区的主要项目 Qi,它是用于表达面向流计算的语言,可通过宏嵌入 Racket 中,最近还发展出 curlique 以更灵活地嵌入 Qi。
- 探讨创建“#lang qi”,使其无缝支持面向流的表达式,并思考如何解决关于“适合大脑”的小语言的问题。
- 通过使用
syntax-parse
的paren-shape
解析和 Racket 的插补点,实现用方括号表示未引号的列表,展示了对语言的探索。 - 作者创建“language experiments”仓库来尝试这些想法,目前有类似 Clojure 和更 Rackety 的语言,未来将探索更多通用特性。
关键信息和重要细节:
- Racket 的模块系统通过“require”可轻松描述引入模块的方式及各种组合。
- 其他语言的异常处理接口如
raise-argument-error
等难以记忆和定义,不实用。 - Qi 是用于表达面向流计算的语言,通过宏
☯
嵌入 Racket,curlique 可更灵活地嵌入 Qi。 - 使用
syntax-parse
和插补点可让方括号表示未引号的列表,如(map {~> sqr add1} [1 2 3 4 5])
。 - “language experiments”仓库按索引分文件夹存放不同语言,目前有 Clojure 样和更 Rackety 的语言,未来将探索更多通用特性。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。