如何在Scheme中的列表中应用匿名函数?

时间:2009-06-03 00:34:48

标签: scheme

我正在学习Scheme。下面的代码有什么问题?我想编写一个程序,从列表中获取第一个函数,然后将其应用于数字?

    (define num  3)

    ;;I want to do something like this which returns 3
    ((λ (x) x)num)

    ;;but my functions are in a list so this should return3
    ((first '((λ (x) x) (λ (x) (* x x)))) num)

我在上面的代码中收到此错误:
程序申请:预期程序,给定:(λ(x)x);参数是:3

当我得到这些输出时意味着什么?

当我不申请任何东西时,我得到一个不错的输出。

(first '((λ(x) x)(λ(x) (*x x))))

返回(λ(x)x)

3 个答案:

答案 0 :(得分:11)

你引用'lambda',所以它没有被评估。

如果你只是在提示符下输入(λ(x)x),DrScheme会显示#<procedure>,这意味着它实际上已经评估了lambda,并给你一个闭包。引用它,你给Scheme只是一个符号列表。

如果要将功能放在列表中,可以执行以下操作:

((first (list (lambda (x) x) (lambda (x) (* x x)))) num)

引号允许您生成一个列表,是的,但是其内容未被评估。列表函数在评估完成后会生成一个列表。

如果您愿意,您也可以对该列表进行quasiquote:

((first `(,(lambda (x) x) ,(lambda (x) (* x x)))) num)

答案 1 :(得分:2)

这些表达方式有什么区别?

> (procedure? (lambda (n) n))
#t
> (procedure? (quote (lambda (n) n)))
#f
> (procedure? '(lambda (n) n))
#f
杰伊为你回答了这个问题,但我还不能投票给他。

答案 2 :(得分:2)

(lambda(x)x)不是一个过程。它是评估到过程的表单。人们对术语有点松散,并且经常将lambda形式称为程序作为一种简写。 “Ceci n'est pas une pipe。”