【果果编程课】009 谁能看见我的糖果名字?—— Lexical Scoping(词法作用域魔法)

(45分钟魔法课 · 适合6-12岁小朋友)

课程目标(今天彻底玩懂这个超级魔法)

  • 明白词法作用域(Lexical Scoping):每个糖果名字(变量)都有自己的“领地”,只在它出现的“文字环境”(写代码时的盒子范围)里有效!
  • 区分大公开盒子(define,全店都知道)和小私人盒子(let / lambda,只在房间里有效)
  • 搞懂 let(兄弟们同时贴标签)和 let*(哥哥先贴,后面的能看见前面)
  • 学会嵌套盒子:外层房间的名字,内层房间看得见
  • 画出“名字领地图”,用身体感受“谁能喊出这个名字”

核心理念:编程就像果果魔法糖果店,不同房间贴不同的糖果价格标签。标签的“可见领地”由它写在哪决定,不会到处乱飞!

第一部分:开场故事 + 全局大招牌(8分钟)

小朋友们好!今天我们来玩“名字侦探”游戏~

想象一下果果的魔法糖果店: - 店门口挂着一个超级大招牌(define candy-price 10)
这代表“原价糖果”这个名字到处都能用!全店所有小精灵、顾客、收银机都知道它值10元。

1
2
3
4
#lang racket
(define candy-price 10)
candy-price
; 输出:10

魔法口诀:全局名字像大喇叭,全店喊得响!
但果果老师提醒:大招牌要珍惜哦~最好只放重要常量和函数(像店里的大价格表),不要乱贴小零食名字!

第二部分:小房间里的临时名字(10分钟)

现在我们进“计算游戏室”玩临时名字!

还记得lambda魔法吗?它给小朋友临时起代号,用完就消失:

1
2
((λ (x y) (+ (* 2 x) y)) 4 5)
; 输出:13

这里 x=4y=5 只在这个咒语房间里有效。一算完,名字就“飞走”了!

let 是lambda的好兄弟,写起来更清楚:

1
2
3
4
(let ([x 4]
[y 5])
(+ (* 2 x) y))
; 输出:13

可视化:想象一个粉色小礼盒,里面贴着 xy 两个标签。盒子关上后,外面的人就看不见了!

第三部分:let 的小心机 vs let* 救场(10分钟)

果果要考考大家啦!

下面这个会不会成功呢?

1
2
3
4
(let ([x 4]
[y 5]
[z (* 2 x)]) ; 这里出错啦!
(+ z y))

为什么失败?
因为 let同时贴标签的!在给 z 贴标签的时候,x 还没完全打开给大家看。
就像三个小朋友同时发代号,第三个不能偷看第一个的名字~

救星来啦!let*(顺序聪明版):

1
2
3
4
5
(let* ([x 4]
[y 5]
[z (* 2 x)])
(+ z y))
; 输出:13 ✓

魔法口诀(大家一起念三遍!):
“let 兄弟手拉手,同时出现!
let* 哥哥先来,一个一个来!”

第四部分:套娃房间的秘密(8分钟)

还有更厉害的玩法——嵌套let(像俄罗斯套娃糖果礼盒!)

1
2
3
4
5
(let ([x 4]          ; 外层大礼盒
[y 5])
(let ([z (* 2 x)]) ; 内层小礼盒
(+ z y)))
; 输出:13

为什么成功? 外层礼盒的名字(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直接运行哦!)