我想我有一个范围问题?

时间:2012-10-30 21:33:26

标签: variables scope scheme let

我正在尝试编写一个程序来计算取得成绩列表的平均成绩点(GPA),并输出GPA。 (作为练习,不是作业)。

测试用例:

(GPA? '(A C B B)) 
3.0

这是我最好的猜测:

(define a 4.0)
(define b 3.0)
(define c 2.0)
(define d 1.0)
(define f 0.0)


(define (mysum lst)
  (let loop ((lst lst) (accum 0))
    (cond
      [(null? lst) accum]
      [else (loop (cdr lst) (+ accum (car lst)))])))

我收到错误:

  

“+中的例外:a不是数字”

当我运行测试用例时:

(mysum '(1 2 3 a))

它应该返回10,但是在过程中不能将a定义为4.0。

有人可以给我一个简单的解释吗?

2 个答案:

答案 0 :(得分:4)

请改为尝试:

(mysum (list 1 2 3 a))

这不是一个范围问题,只是对报价有点误解。当你这样写:

'(1 2 3 a)

你说:我想要一个包含元素1, 2, 3, a的列表。如果您必须使用引号,那么评估a变量的正确语法是:

`(1 2 3 ,a)
=> '(1 2 3 4.0)

...但在这种情况下,使用list程序构建新列表更简单:

(list 1 2 3 a)
=> '(1 2 3 4.0)

对于记录:您可以轻松地在列表中添加所有元素,如下所示:

(apply + (list 1 2 3 a))
=> 10

答案 1 :(得分:2)

'(1 2 3 a)(quote (1 2 3 a))的缩写,意味着逐字列表(1 2 3 a)成为mysum的参数。没有尝试在引号下扩展变量值 - 如果你在那里写字母,则假定字母是你想要的列表。特别是第四个元素列表是符号a,而不是名称为该符号的变量的值。

如果要插入变量值,可以使用list,如另一个答案所示:

(mysum (list 1 2 3 a))

或quasiqoute:

(mysum `(1 2 3 ,a))