我的讲师提供了以下代码:
(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: ?
我的功能出了什么问题?
答案 0 :(得分:4)
您的hello
程序存在过多的空白区域:P。我知道你试图提高它的可读性,但是这样做会引入一些错误。另请注意,在Scheme中,编写右括号的常用方法是在同一行中,而不是在单独的行中(与其他编程语言中的花括号不同)。
以下是格式化代码的推荐方法,也修复了语法错误:
(define (hello lst)
(cond ((null? lst) 0)
((atom? lst) 1)
(else (+ 1 (hello (cdr lst))))))
请注意:
?
之间的不能,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”是它的第一个参数。