方案:计算函数中的lambda符号数

时间:2013-11-18 19:09:42

标签: lambda count scheme

所以我们对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是一个未定义的函数,所以就在那里告诉我,我看错了。不幸的是,我不知道该为此做些什么。

任何帮助都将不胜感激。

由于

2 个答案:

答案 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}}