我对scheme很新,并试图弄清楚如何定义一个函数来测试该函数的参数是否是一个列表,其中一个正确的列表并不重要。
我已经发现我需要检查参数是空列表还是一对。我的空列表工作正常,但我不确定如何检查这对。我刚刚开始与prolog合作,所以我最初的想法是做这样的事情:
(define list?
(lambda (ls)
(if (or (eq? ls (quote()))
(cons(car(ls) cdr(ls))))
true false)))
我的想法是,如果方案可以car和cdr参数,那么它必须是一对,它将返回true。否则就会失败。
但是,传递参数'(1 2)会产生以下结果:
(list? '(1 2))
. . application: not a procedure;
expected a procedure that can be applied to arguments
given: (1 2)
arguments...: [none]
我真的不明白这里发生了什么。另外,我觉得我的想法是如何使这个功能有缺陷,但我真的不知道如何纠正它。
编辑:问题是(如果.....)正在寻找cons的布尔值吗?
答案 0 :(得分:0)
你有正确的想法!但是你的代码不起作用的主要原因是在第四行你有错误的括号。这是你的代码的正确转录:
(define list?
(lambda (ls)
(if (or (eq? ls (quote()))
(cons (car ls) (cdr ls)))
#t #f)))
但在我看来,这个解决方案很糟糕,原因如下:
如果您为此过程提供了不正确的列表,则在尝试car
或cdr
时会出错。
例如:(1 2 3 . 4)
将以错误结束。
在Scheme中,您必须使用文字#t和#f来表示真和假。
缺点总是以" true"
它不会检查整个列表。
我会写这样的程序:
(define list?
(lambda (ls)
(if (null? ls)
#t
(and (pair? ls)
(list? (cdr ls))))))
让我们试试这个例子:(3 . 4)
。它只是一对 - 而不是列表。
ls
是(3.4)。它是空的吗?不,如果分支继续第二。
是对吗?是的 - 继续and
并使用list?
4
ls
为4
。它是空的吗?不。再次,继续第二分支。
是对吗?没有!程序返回#f