我正在学习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)
答案 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。”