--- title: Monkey 是什么 date: 2026-10-21 tags: monkey, 解释器, 语言 summary: 一个用 Go 实现的小型解释器:整数、字符串、数组、哈希、闭包、宏,以及一个能直接在终端里敲的 REPL --- # Monkey 是什么 Monkey 是 Thorsten Ball 在《Writing an Interpreter in Go》里从零实现的一门玩具语言。它的语法像一小块 JavaScript 或 Go: ```monkey let square = fn(x) { x * x }; map([1, 2, 3, 4], square) ``` ```text [1, 4, 9, 16] ``` 本站 `bin/` 里的 Monkey 是这个解释器的一个 Go 实现,额外做了一点 CLI 化改造:支持 `-e`、脚本文件、管道和真正的 pty 交互。 ## 它能做什么 - 整数、字符串、布尔值、数组、哈希 - `let` 绑定、`fn` 函数、闭包、递归 - `if` 表达式、`return` - 宏:`macro`、`quote`、`unquote` - 一批内置函数,以及预置的 `map` / `reduce` / `sum` / `fibonacci` / `unless` 它不是生产语言:没有浮点数、没有循环(用递归代替),标识符只能是字母和下划线,标准库里也只有几个函数。但它足够小,适合拿来做实验、讲解释器,或者在这个博客的终端里随手算点东西。 ## 这个实现的小脾气 - 交互模式按行解析:`fn`、`if` 这类结构要写在一行里;多行程序放进脚本文件。 - 标识符不能带数字:`addOne` 可以,`add1` 不行。 - `//` 是注释,没有块注释。 - 整数除法会截断:`5 / 2` 得到 `2`。 - `puts` 把每个参数单独打印一行,并返回 `null`。 想继续看语法,可以读 [Monkey 基本语法](/posts/monkey/02_monkey_基本语法.md);想知道怎么在这个站点里调用它,看 [在 ssh-blog 里使用 Monkey](/posts/monkey/03_在_ssh_blog_里用_monkey.md)。