我想我有范围问题?
Posted
技术标签:
【中文标题】我想我有范围问题?【英文标题】:I think I have a scope issue? 【发布时间】:2012-10-20 07:37:32 【问题描述】:我正在尝试编写一个程序来计算平均绩点 (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。
谁能给我一个简单的解释这个问题?
【问题讨论】:
【参考方案1】:试试这个:
(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
【讨论】:
【参考方案2】:'(1 2 3 a)
是(quote (1 2 3 a))
的缩写,表示逐字 列表(1 2 3 a)
成为mysum
的参数。从未尝试在引号下扩展变量值——如果您在那里写字母,则假定字母是您想要的列表中的内容。特别是第四个元素列表是符号a
,而不是名称为该符号的变量的值。
如果你想插入变量的值,你可以使用list
,就像在另一个答案中一样:
(mysum (list 1 2 3 a))
或准:
(mysum `(1 2 3 ,a))
【讨论】:
以上是关于我想我有范围问题?的主要内容,如果未能解决你的问题,请参考以下文章