【问题标题】: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。

谁能给我一个简单的解释这个问题?

【问题讨论】:

    标签: variables scope scheme let


    【解决方案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))
      

      【讨论】:

        猜你喜欢
        • 2020-10-29
        • 2013-11-23
        • 1970-01-01
        • 1970-01-01
        • 2011-08-23
        • 1970-01-01
        • 2010-10-22
        • 1970-01-01
        • 2020-03-12
        相关资源
        最近更新 更多