You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Emacs+Geiser中用Racket运行SICP代码遇函数调用问题排查

使用Racket + Geiser学习SICP的常见问题解决

问题场景

  • 原工作流:Emacs + Geiser + MIT Scheme,配置~/.emacs后运行正常
  • 切换原因:为完成SICP 2.2.4节图片语言练习转用Racket,使用#lang sicp编写代码
  • 遇到的问题:
    1. 编写fib函数后执行C-c C-b,在REPL调用(fib 3)提示「fib未定义」
    2. 重装geiser-racket后出现「+合约违反」错误

排查与解决过程

「fib未定义」问题处理

  • 先确认代码加载状态:执行C-c C-b后,查看Geiser REPL是否有加载成功的反馈,若无反馈,大概率是代码存在语法错误,导致Geiser无法解析函数定义
  • 核对fib函数的语法规范,确保符合SICP兼容的Scheme写法,示例正确代码:
    (define (fib n)
      (cond ((= n 0) 0)
            ((= n 1) 1)
            (else (+ (fib (- n 1)) (fib (- n 2))))))
    
  • 若语法无误,可通过C-c C-z切换到当前Racket缓冲对应的REPL,重新执行C-c C-b加载代码

「+合约违反」问题处理

  • 该错误本质是对+的调用不符合#lang sicp的参数要求,比如传入了非数值类型的参数
  • 回溯代码中所有使用+的位置,检查参数类型是否正确——这类错误通常由未被发现的语法问题(如括号不匹配、变量名拼写错误)引发,导致表达式求值结果不符合预期

最终结论

两个问题的核心原因都是代码存在语法错误:

  • 语法错误会阻止Geiser正确加载函数定义,进而出现「未定义」提示
  • 未被捕获的语法错误可能引发后续的合约违反问题,重装geiser-racket无法解决代码本身的问题

内容的提问来源于stack exchange,提问作者Patrick Bucher

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 01:31:06