为什么lambda不是功能

胡萝卜

对于Racket编程语言,为什么不将lambda视为函数?例如,不能将其定义为像这样的高阶函数。(define (my-lambda args body) (lambda args body))

路易斯·卡西利亚斯

有一个关键的区别是您的问题丢失了:

  1. lambda语法
  2. 程序就是价值

lambda形式是表达的形式,其值是一个过程。可以说,“ lambda是一个函数”的问题始于类型错误,因为lambda和过程不在同一个世界中。

但是让我们搁置一旁。另一种看待此问题的方法是根据评估规则进行思考对于将过程应用到参数的默认Scheme评估规则可以用伪代码表示,如下所示:

(define (eval-application expr env)
  (let ((values
        ;; Evaluate each subexpression in the same environment as the 
        ;; enclosing expression, and collect the result values. 
        (map (lambda (subexpr) (eval subexpr env)) 
             expr)))
    ;; Apply the first value (which must be a procedure) to the
    ;; other ones in the results.
    (apply (car values) (cdr values))))

用英语讲:

  1. 在与“父级”相同的环境中评估所有子表达式。
  2. apply 其余列表的第一个结果(必须对过程求值)。

现在,另一个lambda不能成为过程的原因是该求值规则不适用于lambda表达式。尤其要注意的lambda不要立即评估其身体!my-lambda如果您尝试以这种方式使用它,尤其是这会困扰您

(my-lambda (x) (+ x x))

...(x)中间部分必须立即作为x在整个表达式出现的环境中命名的过程的调用进行评估(+ x x)也必须立即进行评估。

因此lambda需要自己的评估规则。正如Basile的答案所指出的那样,通常在Scheme系统实现中将其实现为原语,但是我们可以使用如下伪代码来绘制它:

;;;
;;; Evaluate an expression of this form, returning a procedure:
;;;
;;;     (lambda <formals> <body> ...)
;;;
(define (eval-lambda expr env)
  (let ((formals (second expr))
        (body (cddr expr)))
  ;; We don't evaluate `body` right away, we return a procedure.
  (lambda args
    ;; `formals` is never evaluated, since it's not really an 
    ;; expression on its own, but rather a subpart that cannot
    ;; be severed from its enclosing `lambda`.  Or if we want to
    ;; say it all fancy, the `formals` is *syncategorematic*...
    (let ((bindings (make-bindings formals args)))
      ;; When the procedure we return is called, *then* we evaluate 
      ;; the `body`--but in an extended environment that binds its
      ;; formal parameters to the arguments supplied in that call.
      (eval `(begin ,@body) (extend-environment env bindings))))))

;;;
;;; "Tie" each formal parameter of the procedure to the corresponding
;;; argument values supplied in a given call.  Returns the bindings
;;; as an association list.
;;;
(define (make-bindings formals args)
  (cond ((symbol? formals)
         `((,formals . args)))
        ((pair? formals)
         `((,(car formals) . ,(car args))
           ,@(make-bindings (cdr formals) (cdr args))))))

为了理解此伪代码,经过时间考验的是研究许多Scheme书籍之一,这些书籍展示了如何构建元循环解释器(用Scheme编写的Scheme解释器)。例如,请参阅“计算机程序结构和解释”这一节

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么这不是功能

来自分类Dev

为什么使用lambda而不是普通方法?

来自分类Dev

为什么Java对lambda函数使用->而不是=>?

来自分类Dev

什么时候使用功能模板而不是通用lambda?

来自分类Dev

为什么Apache Spark采取的功能不是并行的?

来自分类Dev

为什么功能打印i:6而不是i:5

来自分类Dev

为什么我的reverse()不是呢?功能正常吗?

来自分类Dev

为什么下面的查询不是“单个组”功能?

来自分类Dev

为什么在分配属性后保存不是功能?

来自分类Dev

为什么Lambda表达式采用char而不是string

来自分类Dev

为什么python lambda看到序列而不是值?

来自分类Dev

为什么我使用 lambda 表达式而不是函数?

来自分类Dev

为什么看不到Lambda功能的CloudWatch Logs?

来自分类Dev

为什么boost建议使用核心功能而不是成员功能?

来自分类Dev

JS为什么说这个功能不是一个功能

来自分类Dev

为什么Python Lambda远比具有相同功能的Javascript Lambda慢?

来自分类Dev

为什么不是'|' 被超载?

来自分类Dev

为什么选择功能应用程序作为默认的Haskell运算符,而不是合成?

来自分类Dev

为什么新功能“二进制文字”以0b开头而不是后缀?

来自分类Dev

为什么与Android的兼容性不是Linux发行版中的常见功能?

来自分类Dev

(Python)为什么不在功能中导入模块,而不是在导入模块时先导入最佳方法?

来自分类Dev

为什么我的功能给我“这不是红色”?

来自分类Dev

为什么我在异步功能中使用setState而不是更新状态(Flutter)?

来自分类Dev

为什么Unity在某些功能(例如GetChild())中使用transform而不是gameObject?

来自分类Dev

为什么要使用外部OpenGL加载程序功能而不是GLAD的内置加载程序?

来自分类Dev

为什么Git Flow建议将功能分支合并到开发分支而不是发布分支

来自分类Dev

为什么片段ktx中有可用的Android viewModels()扩展功能而不是viewmodel-ktx库?

来自分类Dev

为什么与Android的兼容性不是Linux发行版中的常见功能?

来自分类Dev

终端转义序列:为什么终端不报告其支持的功能,而不是依赖terminfo?

Related 相关文章

  1. 1

    为什么这不是功能

  2. 2

    为什么使用lambda而不是普通方法?

  3. 3

    为什么Java对lambda函数使用->而不是=>?

  4. 4

    什么时候使用功能模板而不是通用lambda?

  5. 5

    为什么Apache Spark采取的功能不是并行的?

  6. 6

    为什么功能打印i:6而不是i:5

  7. 7

    为什么我的reverse()不是呢?功能正常吗?

  8. 8

    为什么下面的查询不是“单个组”功能?

  9. 9

    为什么在分配属性后保存不是功能?

  10. 10

    为什么Lambda表达式采用char而不是string

  11. 11

    为什么python lambda看到序列而不是值?

  12. 12

    为什么我使用 lambda 表达式而不是函数?

  13. 13

    为什么看不到Lambda功能的CloudWatch Logs?

  14. 14

    为什么boost建议使用核心功能而不是成员功能?

  15. 15

    JS为什么说这个功能不是一个功能

  16. 16

    为什么Python Lambda远比具有相同功能的Javascript Lambda慢?

  17. 17

    为什么不是'|' 被超载?

  18. 18

    为什么选择功能应用程序作为默认的Haskell运算符,而不是合成?

  19. 19

    为什么新功能“二进制文字”以0b开头而不是后缀?

  20. 20

    为什么与Android的兼容性不是Linux发行版中的常见功能?

  21. 21

    (Python)为什么不在功能中导入模块,而不是在导入模块时先导入最佳方法?

  22. 22

    为什么我的功能给我“这不是红色”?

  23. 23

    为什么我在异步功能中使用setState而不是更新状态(Flutter)?

  24. 24

    为什么Unity在某些功能(例如GetChild())中使用transform而不是gameObject?

  25. 25

    为什么要使用外部OpenGL加载程序功能而不是GLAD的内置加载程序?

  26. 26

    为什么Git Flow建议将功能分支合并到开发分支而不是发布分支

  27. 27

    为什么片段ktx中有可用的Android viewModels()扩展功能而不是viewmodel-ktx库?

  28. 28

    为什么与Android的兼容性不是Linux发行版中的常见功能?

  29. 29

    终端转义序列:为什么终端不报告其支持的功能,而不是依赖terminfo?

热门标签

归档