所以我们对Scheme进行了测试,我遇到了一个错误的问题,但我不知道如何纠正它。它要求的是:
编写一个Scheme函数count_lambda,它接受任意表达式y,并返回y中的'lambda符号数。例如,调用(count_lambda'(lambda x.lambda y.x y)z)应返回2.
我想到如何做到这一点的方法是检查变量是否是“lambda”类型。然而,lambda可能不是一个类型.......而且,我把这个表达式描述为一个列表....不确定我是否也可以这样做......所以这就是我所拥有的:
(define count_lambda
(lambda (y)
(if (null? y) 0
(cond
((lambda? y) 1)
((number? y) 0)
((cons? y) (+ (count_lambda(car y)) (count_lambda(cdr y)))))))
它说lambda是一个未定义的函数,所以就在那里告诉我,我看错了。不幸的是,我不知道该为此做些什么。
任何帮助都将不胜感激。
由于
答案 0 :(得分:0)
这比你想象的要简单。请注意,输入是符号的列表,您需要计算符号'lambda
在列表中出现的次数,而不是实际{{1}的次数}出现。
此外,迭代列表列表的模板不太对。这就是它应该是这样的:
lambda
答案 1 :(得分:0)
Óscar has a good answer,但我只想指出使用lambda?
并不是一个坏主意,但你需要做到。另外,cons?
scheme
中的#!racket
不是原始语言,但也许是表兄语Scheme
,它具有自己的SO标签。
以下是使用最新批准的标准R7RS的#!r7rs
(import (scheme base)
(only (scheme) display))
(define (lambda? x)
(eq? x 'lambda))
(define (count-lambda lst)
(cond
((lambda? lst) 1)
((not (pair? lst)) 0) ; cons? is not a scheme primitive
(else (+ (count-lambda (car lst))
(count-lambda (cdr lst))))))
(display (count-lambda '(yatta (lambda . lambda) #f #t 34
(hey (ho lambda . yiu) lambda )))) ; displays 4
实施:
#!r6rs
(import (rnrs base)
(only (rnrs) display))
与你的代码相比,我已经删除了一个数字的检查(因为不是一对或一个lambda可以是一个不同的符号,一个数字,#t),而是我添加了一个实际上做同样的基本情况
它将在R6RS中运行(因为R7RS仅受到chibi的支持,我们有很多优秀的R6RS实现,如DrRacket和Ikarus,将3个第一行替换为:
{{1}}