首页 > 其他分享 >过程与作用域

过程与作用域

时间:2024-04-16 20:44:06浏览次数:24  
标签:var1 puts 作用域 过程 参数 proc

一个过程创建好后,就可以象 Tcl 内建命令一样直接使用。 

Tcl8.0 以后的版本增加了名字空间(name space),它为过程和变量提供了新的作用域。 

1. proc—过程定义命令 

使用 proc 命令定义过程: 

proc procName { var1 var2 ... } { body

 

proc 命令有三个参数:

  • procName 是定义的过程名字;

  • {var1 var2 ...}是输入、输出参数列表;

  • body 是过程执行命令体。 body 的界定大括弧和 if 等命令的命令执行体遵循相同的规则和注意事项。 

  • 可以使用 return 命令在需要的时候返回调用程序。 
  • 使用过程的时候,不一定输入所有的参数值。过程的输入参数可以有默认值。默认值由{默认参数名 默认值}指定。如果调用过程时没有指定这些参数的值则会使用其默认值,否则使用输入值来替代默认值。在使用默认参数的时候要注意,如果默认参数之后还有非默认参数,则在调用此过程的时候,默认参数的值也要求输入,否则会出错。

带有默认参数的过程定义示例:

proc Test {a {b 7} {str "hello World"}}  {

  puts "$str"

  return [expr $a * $b]

}

Test 10

 => Hello World

  70

Test 10 5 "Call Test"

 => Call Test

  50

如果参数列表中最后一个参数是 args 的话,则过程可以接收可变数目的输入参数。当调用过程时,除了指定参数以外的参数值都被 args 接收。如果参数列表中只有 args 一项,则 args 接收所有输入参数值。

proc vParam {args} {

  puts "input values are : $args"

vParam

 => input values are :

vParam 1 "Hello" 2 3 "End"

 => input values are : 1 Hello 2 3 End

2. 作用域       

2.1 过程的作用域           

默认情况下,过程名具有单一的作用域即全局作用域。所以可以在脚本的任何地方使用一个过程(使用之前,过程必须已经定义)。可以通过名字空间来限定过程的作用范围。如可以通过名字空间命令设置一个过程可以让外部调用,也可以设置过程不为外部所使用。 

过程的定义可以嵌套,低层定义的过程只有在上层过程被执行后才能生效。 

proc one {} {

  puts "I'm one"

  proc two {} {

     puts "I'm two"

  }

  puts "Call two in one:"

  two

}   

two

 => invalid command name "two"

one

 => I'm one

  Call two in one:

  I'm two

  two

 => I'm two

2.2 变量的作用域 

对于变量而言,根据其作用域可分为全局变量和局部变量。在所有过程之外定义的变量为外部变量,即全局变量,它的作用域为从开始定义到执行结束,除非中间有显式取消其定义。在一个过程体内定义的变量为内部变量,即局部变量,局部变量的作用域只限于过程内部使用,在此过程外面不能使用这些变量。在一个过程内部,即可以使用自身的局部变量,又可以使用全局变量,但是全局变量在过程内部不会自动可见,需要通过 global 命令来事先声明。因为作用域不同,所以过程中的变量可以与全局变量、其他过程中的变量有相同的名字。

在过程定义中的输入、输出参数列表中的参数为过程的内部参数。 

set a 5

set b -8

set c 10

proc P1 {a} {

set b 42

global c

puts "$a"

puts "$b"

puts "$c"

}

P1 $b

 => -8

  42

  10

全局变量的定义不一定要在过程外完成,可以在任何一个过程中完成,其效果是将一个局部变量的作用域进行了扩展。但是在引用全局参数的值之前全局参数应首先已被赋值。

另外当一个过程中要使用与局部变量相同名字的参数时,用global 命令就要小心:你不能在定义完成一个局部变量后再用 global 命令使用同名的全局参数,这会出错。 

proc P2 {} {

  global var1

  set var1 100

  puts "var1=$var1"  #在P2内定义全局变量

}

proc P3 {} {

  global var1

  puts "var1=$var1"

}

proc P4 {} {

  global var2

  put $var2

}

proc P5 {} {

  set a 30

  global a

  puts "a=$a"

}

P2

 => var1=100

P3

 => var1 = 100

P4  #试图使用不存在的全局变量

 => can't read "var2:no such variable"

P5  #在定义局部变量后视图引用同名全局变量

 => variable "a" already exists

还有另外一种方式来直接使用全局变量即用双冒号( ::,见下例:

proc test {} {

  puts "The value of global variable var1 is $::var1"

}

set var1 20

 => 20

test

 => The value of global variable var1 is 20

 

标签:var1,puts,作用域,过程,参数,proc
From: https://www.cnblogs.com/love-9/p/18139148

相关文章

  • c# sqlserver向存储过程传入xml数据
    c#代码:点击查看代码varxmlData=newXDocument(newXElement("Data",query.weldPlanList.Select(r=>newXElement("Row",newXAttribute("APSFactoryID",query.APSFactoryID),......
  • 过程宏(proc-macro)
    优点增加代码的复用。性能。因为是在编译时生成,所以会得到更好的性能。没测试过,有待商榷过程宏的分类proc-macroproc-macro-deriveproc-macro-attribute构建过程宏的必要设置构建过程宏,要在cargo.toml里面设置一些参数,这是必须的。一般来说,过程宏必须是一个库,或者作为......
  • Java使用javacv处理视频文件过程记录
    最近接到一个需求是将.mp4/.m4v文件体积进行压缩,我使用javacv中的FFmpegFrameGrabber、FFmpegFrameFilter、FFmpegFrameRecorder简单的实现视频帧的抓取、过滤、录制与输出。性能暂未验证。文章对这次的过程进行记录。1.jdk的选择mcr.microsoft.com/java/jdk:8u222-zulu-cento......
  • 定义存储过程和函数
    定义存储过程和函数本文出处:https://www.modb.pro/db/222642学习地址https://www.modb.pro/course/133学习目标学习openGauss定义存储过程和函数课后作业1.创建带有入参和出参的函数1,调用函数时使用按参数值传递和命名标记法传参omm=#createfunctionfunc_multiply(......
  • 9个MogDB存储过程示例
    9个MogDB存储过程示例本文出处:https://www.modb.pro/db/400634存储过程是一组结构化的查询和语句,例如控制语句和声明。这里介绍9个在不同情况下很有用的存储过程示例。创建测试表:createtablepublic.test1(idint,namevarchar(10));使用存储过程插入数据CREATEORR......
  • 十大管理每个过程定义以及作用
    一、整体管理1、制定项目章程制定一份正式批准并授权项目经理在项目活动中使用活动资源的文件。明确了项目于组织战略目标之间的直接联系;确立了项目的正式地位;展示了组织对项目的承诺。2、制定项目管理计划组织、准备和协调项目计划的其他组成部分的文件,并把它们整合成一份综合的......
  • 【已解决】squashfs4.3编译过程中的一些问题
    Q:执行./build.sh时,mksquashfs.c和unsquashfs.c报错找不到major()和minor()函数的定义,找不到‘makedev’cc-O2-I.-D_FILE_OFFSET_BITS=64-D_LARGEFILE_SOURCE-D_GNU_SOURCE-DCOMP_DEFAULT=\"gzip\"-Wall-DGZIP_SUPPORT-DXATTR_SUPPORT-DXATTR_DEFAULT-c-omksqua......
  • 一道变态的关于作用域的探究问题
    varx=1functionfoo(x=11,y=function(){x=2}){console.log(x)//打印的()的形参x因为默认值为11所以打印11y()//y函数执行修改的是foo括号里面形参的值console.log(x)//由于()中的x被y函数修改所以x值变为2x......
  • 参数,名称空间,作用域
    1函数的调用方式【1】直接调用函数名()-->调用函数defstudent(name,age):print(f"mynameis{name},myageis{age}")#函数名()-->调用函数student(name="silence",age=16)#mynameissilence,myageis16【2】用表达式调用函数用一个新变量存储函数的内......
  • MySQL-09-mysql 存储过程入门介绍
    拓展阅读MySQL00ViewMySQL01Rulermysql日常开发规范MySQL02truncatetable与delete清空表的区别和坑MySQL03Expression1ofORDERBYclauseisnotinSELECTlist,referencescolumnMySQL04EMOJI表情与UTF8MB4的故事MySQL05MySQL入门教程(MySQLtutor......