1. Dynamic Scoping 解释:

对应的是static scoping。我们现在熟悉的大部分语言都是static scoping的(C,Python,Java)

static scoping意思是变量在声明之后只能在它所在的block中可见

dynamic scoping则是在对应的subfunction中也可见

2. 用perl(允许dynamic scoping)举个例子:

一共有两个package——AdvancedTournament 和 AdvancedFighter:

我们首先看看变量的声明方:

sub update_fighter_properties_and_award_coins{#coins_to_obtain等变量是AdvancedFighter这个包中变量#在这里我们用local关键字将他们变成本地的一个变量my($self,$fighter,$flag_defeat,$flag_rest) = @_;local $AdvancedFighter::coins_to_obtain = $AdvancedFighter::coins_to_obtain;local $AdvancedFighter::delta_attack = $AdvancedFighter::delta_attack;local $AdvancedFighter::delta_defense = $AdvancedFighter::delta_defense;local $AdvancedFighter::delta_speed = $AdvancedFighter::delta_speed;my $history = $fighter->{history_record};my @history_record = @$history;my $length = @history_record;#对这几个本地变量修改if ($flag_rest){$AdvancedFighter::coins_to_obtain /= 2;$AdvancedFighter::delta_attack = 1;$AdvancedFighter::delta_defense = 1;$AdvancedFighter::delta_speed = 1;}#这里使用两个函数:上面的local变量会自动传入这两个函数$fighter->update_properties();$fighter->obtain_coins();return;
}

函数调用方——update_properties(), obtain_coins():

sub update_properties{my($self) = @_;#这里的delta_attack 就是来自于调用这个函数的父函数中的变量$self->{"attack"} += $delta_attack;if($self->{"attack"} < 1){$self->{"attack"} = 1;}$self->{"defense"} += $delta_defense;if($self->{"defense"} < 1){$self->{"defense"} = 1;}$self->{"speed"} += $delta_speed;if($self->{"speed"} < 1){$self->{"speed"} = 1;}return;
}

这样的话就是典型的dynamic scoping了:update_properties使用的变量可以来自于它的父函数

注意:local修饰的变量允许dynamic scoping,而my是不允许的

3. Dynamic Scoping的优缺点

Advantage:用户可以像使用参数一样使用来自父函数的变量,使得变量的传输更加直接

Disadvantage: 在现在这个时代,代码量非常巨大,如果使用dynamic scoping的话会大大降低代码的可读性已经理解性。因此dynamic scoping已经极少使用了。

Dynamic Scoping (动态范围)相关推荐

  1. Lexical Scoping 和 Dynamic Scoping

    Lexical Scoping 和 Dynamic Scoping A name that is lexically bound is looked up only in bindings in th ...

  2. javascript闭包_JavaScript闭包教程–带有JS闭包示例代码

    javascript闭包 Closures – many of you JavaScript devs have probably heard this term before. When I sta ...

  3. JavaScript词汇表

    Asynchronous 异步 Block 块 Block Scoping 块作用域 Callback 打回来 Declarative 陈述式 Fallback 倒退 Function Scoping ...

  4. python函数速查_Python语法速查: 7. 函数基础

    本篇索引 (3)作用域 (4)递归 (1)函数基本 ● 函数是第一类对象 Python中万物皆对象,所有对象都是第一类的(first class),函数也不例外,也是第一类对象.既然是对象,那就可以当 ...

  5. 如何设计一门语言(七)——闭包、lambda和interface

    人们都很喜欢讨论闭包这个概念.其实这个概念对于写代码来讲一点用都没有,写代码只需要掌握好lambda表达式和class+interface的语义就行了.基本上只有在写编译器和虚拟机的时候才需要管什么是 ...

  6. Coursera系列-R Programming第三周-词法作用域

    完成R Programming第三周 这周作业有点绕,更多地是通过一个缓存逆矩阵的案例,向我们示范[词法作用域 Lexical Scopping]的功效.但是作业里给出的函数有点绕口,花费了我们蛮多心 ...

  7. 如何设计一门语言(十)——正则表达式与领域特定语言(DSL)

    几个月前就一直有博友关心DSL的问题,于是我想一想,我在gac.codeplex.com里面也创建了一些DSL,于是今天就来说一说这个事情. 创建DSL恐怕是很多人第一次设计一门语言的经历,很少有人一 ...

  8. Unity 5 中的全局光照技术详解

    简介 全局光照,简称GI,是一个用来模拟光的互动和反弹等复杂行为的算法,要精确的仿真全局光照非常有挑战性,付出的代价也高,正因为如此,现代游戏会先一定程度的预先处理这些计算,而非游戏执行时实时运算. ...

  9. Common Trace Format

    2019独角兽企业重金招聘Python工程师标准>>> Common Trace Format (CTF) Specification (v1.8.1)Mathieu Desnoye ...

  10. 多C++标准版本指定

    本文主要介绍 CMake 中 include 指令的相关知识. 1 概述 引用 CMake 官网对于 include 指令的介绍,如下: Load and run CMake code from a ...

最新文章

  1. 华为RH8100v3巡检
  2. gulp前端自动化相关文章收集
  3. mysql内部安装workb_centOS系统中下安装mysql workbench图文详细步骤
  4. JZOJ 5286. 【NOIP2017提高A组模拟8.16】花花的森林
  5. Vue入门教程:node安装vue命令行工具及启动项目
  6. 编码(2)从字节理解Unicode(UTF8/UTF16)
  7. 忍着疼痛奔跑,带着泪光微笑!
  8. (JAVA)Arrays数组工具类
  9. java 泛型 加_Java泛型并将数字加在一起
  10. RTFM? 如何写一本值得一读的手册
  11. 服务器宕机不再愁!Docker 内置功能帮您解决
  12. python 内置运算
  13. 永远不要低估“价值互联网”!| 技术头条
  14. QNAP 提醒客户注意 eCh0raix 勒索攻击和 Room Server 0day
  15. 8考勤填报_公司考勤管理制度
  16. YUM更换源(1)--yum找不到安装包
  17. Consider the following: If you want an embedded database (H2, HSQL or Der...
  18. py+webdriver学习之旅6:cookie
  19. 数字信号处理基础知识
  20. openlayers3.0叠加天地图底图及注记后再叠加geoserverWMS服务

热门文章

  1. 图片怎么识别文字?这几个方法很实用
  2. 基于物联网的智能厨房安全监测系统-上位机程序
  3. Nginx负载均衡是酱紫做的
  4. Pulsar的Proxy支持和SNI路由 - 修改...
  5. GPU服务器与CPU服务器的区别,如何选择GPU服务器
  6. linux poodle漏洞,SSL POODLE[贵宾犬]漏洞的解决办法
  7. 手机内存卡大小的计算
  8. 人工智能研究中心快递柜——代码分析九
  9. 为小米4与小米3 Mi3 Mi4编译Cyanogenmod 12.1与13.0 (CM12与CM13) 的步骤以及错误解决
  10. MT7620A的DTS