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

unj*_*nj2 6 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)
Run Code Online (Sandbox Code Playgroud)

我得到上述代码的错误:
程序应用程序:预期程序,给定:(λ(x)x); 争论是:3

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

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

(first '((?(x) x)(?(x) (*x x))))
Run Code Online (Sandbox Code Playgroud)

返回(λ(x)x)

Jay*_*nek 11

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

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

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

((first (list (lambda (x) x) (lambda (x) (* x x)))) num)
Run Code Online (Sandbox Code Playgroud)

引号允许您生成一个列表,是,但是其内容未被评估.列表函数在评估之后会从其所有参数中生成一个列表.

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

((first `(,(lambda (x) x) ,(lambda (x) (* x x)))) num)
Run Code Online (Sandbox Code Playgroud)