racket - 解释为什么这个球拍语言代码中的 x 值没有更新?
问题描述
这段代码:
(let ((x 2)) (let((f (lambda (n)(+ x n )))) (let (( x 17)) (f 3 ))))
给我答案 5,为什么 x 值没有从 2 更新到 17?
解决方案
词汇范围的魔力。
这是一个带有评论的版本:
(let ((x 2))
; x is bound to 2
(let ((f (lambda (n) (+ x n))))
; f is bound to a function that adds `x` and a number `n`
(let ((x 17)) (f 3))))
; Bind `x` to 17, call (f 3) in the body.
在第三行中,namex
绑定到 17。但是前面let
已经绑定f
了 add2
和一个新的 number n
。这证明了相同的想法:
(let ((f (λ (n) (+ 2 n))))
(let ((x 17)) (f 3)))
推荐阅读
- safari - Safari 12.1.2 及更高版本中的 jQuery 3.3.1 文件上传冻结
- jquery - 当验证正在处理以形成提交事件时,如何通过验证器添加方法验证表单并显示加载图像?
- python - 如何将特定数量的额外工作人员添加到现有的多处理池中?
- python - 在 dict 中写 python 列表到 excel
- java - Java setter 不改变整数的值
- android - HTTP 请求失败,HTTP 状态:504
- javascript - 如何在所需功能上使用 Jasmine.js 间谍
- shell - 如何在shell脚本中使用for循环打印素数
- java - 如何使用 IntelliJ 部署 JavaFX 应用程序?
- solr - 在 Solr Cloud(带有 zookeeper 设置)上,一个特定的节点 tlog 填充无异常地增长