【果果编程课】009 谁能看见我的糖果名字?—— Lexical Scoping(词法作用域魔法)
(45分钟魔法课 · 适合6-12岁小朋友)
课程目标(今天彻底玩懂这个超级魔法)
- 明白词法作用域(Lexical Scoping):每个糖果名字(变量)都有自己的“领地”,只在它出现的“文字环境”(写代码时的盒子范围)里有效!
- 区分大公开盒子(define,全店都知道)和小私人盒子(let / lambda,只在房间里有效)
- 搞懂 let(兄弟们同时贴标签)和 let*(哥哥先贴,后面的能看见前面)
- 学会嵌套盒子:外层房间的名字,内层房间看得见
- 画出“名字领地图”,用身体感受“谁能喊出这个名字”
核心理念:编程就像果果魔法糖果店,不同房间贴不同的糖果价格标签。标签的“可见领地”由它写在哪决定,不会到处乱飞!
第一部分:开场故事 + 全局大招牌(8分钟)
小朋友们好!今天我们来玩“名字侦探”游戏~
想象一下果果的魔法糖果店: -
店门口挂着一个超级大招牌:(define candy-price 10)
这代表“原价糖果”这个名字到处都能用!全店所有小精灵、顾客、收银机都知道它值10元。
1 | #lang racket |
魔法口诀:全局名字像大喇叭,全店喊得响!
但果果老师提醒:大招牌要珍惜哦~最好只放重要常量和函数(像店里的大价格表),不要乱贴小零食名字!
第二部分:小房间里的临时名字(10分钟)
现在我们进“计算游戏室”玩临时名字!
还记得lambda魔法吗?它给小朋友临时起代号,用完就消失:
1 | ((λ (x y) (+ (* 2 x) y)) 4 5) |
这里 x=4、y=5
只在这个咒语房间里有效。一算完,名字就“飞走”了!
let 是lambda的好兄弟,写起来更清楚:
1 | (let ([x 4] |
可视化:想象一个粉色小礼盒,里面贴着 x
和 y 两个标签。盒子关上后,外面的人就看不见了!
第三部分:let 的小心机 vs let* 救场(10分钟)
果果要考考大家啦!
下面这个会不会成功呢?
1 | (let ([x 4] |
为什么失败?
因为 let 是同时贴标签的!在给
z 贴标签的时候,x 还没完全打开给大家看。
就像三个小朋友同时发代号,第三个不能偷看第一个的名字~
救星来啦!let*(顺序聪明版):
1 | (let* ([x 4] |
魔法口诀(大家一起念三遍!):
“let 兄弟手拉手,同时出现!
let* 哥哥先来,一个一个来!”
第四部分:套娃房间的秘密(8分钟)
还有更厉害的玩法——嵌套let(像俄罗斯套娃糖果礼盒!)
1 | (let ([x 4] ; 外层大礼盒 |
为什么成功?
外层礼盒的名字(x、y),内层小礼盒看得见!
这就是词法作用域的核心:名字的领地由“文字位置”决定,外盒管内盒!
身体游戏(全班动起来!):
- 外圈小朋友代表外层let,喊出“x=4”
- 内圈小朋友代表内层let,能听到外圈的名字,但外圈听不到内圈的“z”
(像套娃层层打开,超级好玩!)
第五部分:动手练习 + 回家作业(9分钟)
课堂小侦探游戏(5分钟): 1. 把圆面积魔法
((λ (r) (* 3.14 r r)) 5) 改成 let
版(糖果店要算圆形包装盒面积) 2. 用 let* 计算:原价=6元,打折后
y=原价+3,促销 z=原价*y,最后输出总价 3. 试试把上面改成嵌套
let,看看谁先成功!
回家作业(超级重要!): 1. 画图挑战:在纸上画一个“魔法糖果礼盒领地图”(大盒子套小盒子,标出每个名字谁能看见) 2. 糖果店计算器:用 let* 写一个程序:买10个糖果(每个2元),付20元,算找零多少 3. 把代码截图 + 手绘图发给果果老师!(优秀作品下节课展示)
核心总结口诀(回家也要念!):
“全局名字满天飞,局部名字关小屋!
let 同时绑,let* 顺序来,
外盒名字里面见,名字规矩记心头!”
下节课预告
当小礼盒里的名字“逃出”房间还能继续使用时,会发生什么神奇的事?
第010课:闭包 Closure 魔法 —— 把递归 + map + filter +
词法作用域合成超级糖果店管理系统!(无限糖果树 +
自动算账 + 促销套餐,一次搞定!)
小朋友们,今天你们都成了“名字侦探”大师!
快去试试让你的糖果名字听话吧~
果果老师下节课见!🍬✨
(本课完全基于Racket官方词法作用域规则 + 001-008课的糖果店主题设计,代码在DrRacket直接运行哦!)


