clisp 默认不支持 Scheme,因其是 Common Lisp 实现而非 Scheme 实现,语法、求值模型和宏系统均不兼容;加载 .scm 文件会因非法字符(如 #、define)报错;推荐使用 Chez Scheme 或 Racket 替代。

clisp 默认不支持 Scheme,直接用 clisp -i 加载 .scm 文件会报错:*** - READ from #<INPUT BUFFERED FILE-STREAM...>: illegal character #\#。这不是路径或语法问题,而是语言引擎不匹配。
为什么不能用 clisp 直接跑 Scheme 文件
CLISP 是 Common Lisp 实现,不是 Scheme 实现。两者虽同属 Lisp 家族,但语法、求值模型、宏系统完全不同。#lang racket 或 (define (f x) ...) 这类典型的 Scheme 写法,在 clisp 里会被当作非法字符或未定义符号处理。常见错误包括:
*** - EVAL: undefined function DEFINE-
*** - READ: illegal character #\#(遇到#t、#f或#lang) -
*** - LOAD: file does not exist(其实是读取失败,不是路径错)
推荐用 Chez Scheme 或 Racket 替代 clisp
Windows 下轻量、启动快、Notepad++ 兼容好的 Scheme 实现只有两个靠谱选择:
-
Chez Scheme:编译型,极快,无依赖,命令行原生支持
-s参数加载源码;安装后路径如C:\Program Files\Chez Scheme\bin\ta6nt\petite.exe -
Racket:交互友好,自带 IDE,命令行用
racket -f或racket -e;安装后一般在C:\Program Files\Racket\racket.exe
二者都支持标准 Scheme(R5RS/R7RS),且能通过 $(FULL_CURRENT_PATH) 正确传入文件路径。
Notepad++ 中配置 Chez Scheme 一键运行
菜单栏 → 运行 → 运行 → 输入以下命令(注意路径按你实际安装位置调整):
cmd /k "C:\Program Files\Chez Scheme\bin\ta6nt\petite.exe" -s "$(FULL_CURRENT_PATH)" & PAUSE
保存为 Chez Run,绑定快捷键(如 Ctrl+Shift+F5)。关键点:
- 必须用双引号包裹可执行路径,因含空格
-
-s是 Chez 的“加载并执行”标志,缺它只会进 REPL 不运行 - 不要加
exit,PAUSE已足够看输出;加exit可能导致窗口闪退 - 确保文件编码是 UTF-8 无 BOM,否则中文注释可能触发
invalid byte sequence
用 Racket 配置时的常见坑
若选 Racket,命令写成这样:
cmd /k racket -f "$(FULL_CURRENT_PATH)" & PAUSE
但要注意:
- 如果文件开头有
#lang racket,必须用racket -f;若只是纯 R5RS,得改用racket --script或前置#lang r5rs - Racket 会自动识别扩展名,但 Notepad++ 若当前文件没保存(即无
EXT_PART),$(FULL_CURRENT_PATH)为空,直接报错 - 首次运行可能弹 UAC 提权框——不是配置错,是 Racket 安装时注册了 COM 组件,关掉杀毒软件临时提权即可
真正容易被忽略的是:Scheme 程序末尾是否显式调用函数。比如只写 (define (hello) (display "hi")) 不会输出任何内容;必须补上 (hello) 或 (exit),否则窗口停在空白状态,以为“卡了”。


















