【问题标题】:How do I Apply an Anonymous Function from a List in Scheme?如何从 Scheme 中的列表中应用匿名函数?
【发布时间】:2009-06-03 00:34:48
【问题描述】:

我正在学习 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)

【问题讨论】:

    标签: scheme


    【解决方案1】:

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

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

    如果你想把你的函数放在一个列表中,你可以这样做:

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

    引用允许您生成一个列表,是的,但它的内容不被评估。 list 函数在计算完所有参数后,会根据其所有参数生成一个列表。

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

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

    【讨论】:

      【解决方案2】:

      这些表达有什么区别?

      > (procedure? (lambda (n) n))
      #t
      > (procedure? (quote (lambda (n) n)))
      #f
      > (procedure? '(lambda (n) n))
      #f
      

      Jay 为你回答了这个问题,但我还不能投票给他。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 是的,但对于被此类问题迷惑的新手来说,最终解释是没有用的。请注意顺便说一句,从那时起,Racket 改变了它打印值的方式,这导致了更清晰的错误:“... expected procedure, given: '(λ (x) x) ...”——引用是新的。
        • 当我还是一个新手的时候,这正是我需要澄清困惑的句子,所以我把它写下来帮助别人。也许这对除了我以外的每个人都“最终没用”。
        • 问题是Scheme在代码和数据之间有一些(非常故意的!)混淆,x'x,你的解释是正确的(正如我所说)但它是一种类似的元级别的混淆,其中x 是数据,“绑定到 x 的值”是“代码”。对很多学生来说,这种二元性是非常令人困惑的,而且大多数情况下直到他们通过元循环评估器之类的东西才能完全清楚。
        • 它变得更糟了,因为它更像是“绑定到 x 的变量单元格包含 x 的值”:P
        • 是的,我有意避免在引入突变和位置时获得额外的间接性。
        猜你喜欢
        • 2013-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多