1

我的讲师提供了以下代码:

(define (length list)
(cond (( null ? list) 0 )
(( atom ? list) 1 )
( else
( + 1 ( length (cdr list))))

但是它无法编译,Scheme 一直在等待输入,所以我以一种对我来说看起来更潮的方式重写了它,并注意到它缺少 2 个括号(请注意,这是我第一次接触 Scheme,我不是确定正确的布局和书写方式):

(define 
    (hello list)
    (cond 
        (( null ? list) 0 )
        (( atom ? list) 1 )
        (else
            (+1
                ( hello (cdr list))
            )
        )
    )
)

我还将它重命名为hello只是为了表明这是我正在执行的代码。

但是运行它会得到以下错误:

]=> (hello '(a b c))

;Unbound variable: ?

我的功能有什么问题?

4

3 回答 3

4

您的hello程序存在过多的空白:P。我了解您正在尝试提高其可读性,但这样做会引入一些错误。另请注意,在 Scheme 中,编写右括号的常用方法都是在同一行中,而不是在单独的行中(与其他编程语言中的花括号不同)。

这是格式化代码的推荐方法,还修复了语法错误:

(define (hello lst)
  (cond ((null? lst) 0)
        ((atom? lst) 1)
        (else (+ 1 (hello (cdr lst))))))

意识到:

  • 和之间不能有空格,对于and也是一样的:过程被称为and ,不是and ,一个单一的意思是什么null?atom?null?atom?nullatom?
  • 和之间必须有空格,加法的过程称为not+1++1
  • 调用参数是个坏主意list,该名称与内置过程冲突list,因此我将其重命名为lst

附带说明:所编写的过程不必要地复杂,注意定义的长度没有考虑嵌套列表,它可以简单地表达如下:

(define (hello lst)
  (cond ((null? lst) 0)
        (else (+ 1 (hello (cdr lst))))))
于 2013-05-23T18:33:46.323 回答
1
(null ? list)

这将调用null带有参数?和的函数list。但是,正如错误消息所述,没有命名变量?(也没有一个名为 的函数null,但Scheme 并没有那么远,所以错误消息没有提到它)。

但是有一个名为 的函数null?,它几乎肯定是您要调用的函数。所以:

(null? list)

请注意,?innull?只是函数名称的一部分,您不能在名称中间放置空格。

这同样适用(atom ? list)于下一行。

于 2013-05-23T18:17:58.827 回答
0

首先,函数的名称是“null?” 和“原子?”。既然你已经分开了“?” 从它们中使用空格,Scheme 将问号视为单独的符号,而不是函数名的一部分。

此外,出于同样的原因,您将希望使用用空格分隔的“+1”而不是“+1”。函数的名称是“+”,“1”是它的第一个参数。

于 2013-05-23T18:22:32.500 回答