Scheme中列表长度的自定义函数?

时间:2013-05-23 18:07:04

标签: functional-programming scheme

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

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

然而它不会编译并且Scheme一直在等待输入,所以我以一种看起来很漂亮的方式重写它并注意到它有2个缺少括号(请注意这是我第一次触及Scheme,I我不确定正确的解决方法和写作方式。:

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

我还将其重命名为hello只是为了明确这是我的代码执行。

然而,运行它会收到以下错误:

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

;Unbound variable: ?

我的功能出了什么问题?

3 个答案:

答案 0 :(得分:4)

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

以下是格式化代码的推荐方法,也修复了语法错误:

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

请注意:

  • null和?之间的不能,atom?同样的事情:程序被调用{ {1}}和null?,而不是atom?null,而单个atom则无意义
  • 必须?+之间的空格,添加的过程称为1而不是+
  • 调用参数+1是个坏主意,该名称与内置程序list发生冲突,因此我将其重命名为list

作为旁注:所写的过程不必要地复杂,注意到定义的长度没有考虑嵌套列表,它可以表达为这样简单:

lst

答案 1 :(得分:1)

(null ? list)

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

然而,有一个名为null?的函数,几乎可以肯定是你要调用的函数。所以:

(null? list)

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

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

答案 2 :(得分:0)

首先,函数的名称是“null?”和“atom?”。由于您使用空格将“?”与它们分开,因此Scheme将问号视为单独的符号,而不是函数名称的一部分。

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