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

CS61A课程Scheme代码map参数类型错误求助

CS61A Scheme代码报错修复

我正在学习CS61A课程,完全按照教授屏幕上的代码逐字输入,但运行时始终报错。

原代码

(define (evenSub s)
  (if (null? s) nil
    (append (evenSub (cdr s))
      (map (lambda (t) (cons (car s) t))
        (if (even? (car s))
          (evenSub (cdr s))
          (oddSub (cdr s))
          )
        )
      (if (even? (car s)) (list (list (car s))) nil))))

(define (oddSub s)
  (if (null? s) nil
    (append (oddSub (cdr s))
      (map (lambda (t) (cons (car s) t))
        (if (odd? (car s))
          (evenSub (cdr s))
          (oddSub (cdr s))))
      (if (odd? (car s)) (list(list((car s))) nil)))))

报错信息

XL@mbp lab11 % python3 scheme -i evensub.scm
Welcome to the CS 61A Scheme Interpreter (version 1.2.5)

scm> (evenSub '(3 4))
Traceback (most recent call last):
  0 (append (evensub (cdr s)) (map (lambda (t) (cons (car s) t)) (if (even? (car s)) (evensub (cdr s)) (oddsub (cdr s)))) (if (even? (car s)) (list (list (car s))) ()))
  1 (map (lambda (t) (cons (car s) t)) (if (even? (car s)) (evensub (cdr s)) (oddsub (cdr s))))
Error: argument 1 of map has wrong type (NoneType)
scm> 

错误分析与修复

报错提示map的第一个参数为NoneType,问题出在oddSub函数的最后一行:
原错误代码存在两层语法问题:

  1. (car s)被额外嵌套了一层括号,变成((car s)),这会尝试把(car s)的结果当作函数调用,导致求值失败返回空值;
  2. if表达式结构错误,假值表达式nil被错误地放到了list的参数列表中,不符合(if 条件 真值表达式 假值表达式)的语法规范。

修正后的该行代码:

(if (odd? (car s)) (list (list (car s))) nil)

修正后的完整oddSub函数

(define (oddSub s)
  (if (null? s) nil
    (append (oddSub (cdr s))
      (map (lambda (t) (cons (car s) t))
        (if (odd? (car s))
          (evenSub (cdr s))
          (oddSub (cdr s))))
      (if (odd? (car s)) (list (list (car s))) nil))))

内容的提问来源于stack exchange,提问作者ellen2020.py

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 21:32:27