tcl库函数(合集)
TCL脚本技术及用法

处理返回结果 对TCL_OK与TCL_ERROR的处理 撤消解释器 删除命令
编写析构过程
TCL命令扩展
方法(一) 编写扩展命令函数: int Tcl_CmdProc(ClientData clientdata,Tcl_Interp* interp, int argc, char* argv[]); 注册命令函数: Tcl_CreateCommand(Tcl_Interp* interp, char* cmdName,Tcl_CmdProc* cmdProc,ClientData clientdata,Tcl_CmdDeleteProc* deleteProc) 缺点:TCL从外部应用到内部实现都是基于字符串的, 这样在涉及到类型转换时,需要在各种数据类型及其 字符串表示之间来回转换,效率比较低,加上TCL是 解释执行的,导致在利用TCL作较为大型的应用程序 时执行速度不够理想 。
Tcl库
初始化 语法分析器 命令循环
应用程序
核心 命令
公用子程序
程序 自定义 命令
TCL命令扩展
扩展一个TCL命令大致可以分为两步:编写扩展命令 对应的C/C++过程,注册命令。对Tcl命令的扩展过 程一般按下图所示的步骤进行:
编写命令处理过程 创建Tcl解释器 进行初始化工作
Tcl初始化(Tcl_Init) 关联命令与命令处理过程 将有关的Tcl变量与C变量关联 指定启动的脚本
TCL语法
注释
TCL中的注释符是‘#’,‘#’和直到所在行结尾的 所有字符都被TCL看作注释,TCL解释器对注释将不作 任何处理 。 E.G: %#This is a comment % set a 100 # Not a comment % wrong # args: should be "set varName ?newValue?" E.G: % set b 101 ; # this is a comment % 101
TCL基础教程——数学计算

TCL基础教程——数学计算TCL是一种脚本语言,它可以用于编写各种应用程序和脚本。
TCL提供了丰富的数学计算功能,包括基本的算术运算、数学函数、随机数生成等。
本教程将介绍如何在TCL中进行数学计算。
1.基本的算术运算TCL支持常见的四则运算,可以使用加号"+"、减号"-"、乘号"*"、除号"/"进行加、减、乘、除运算。
例如:``` tclset a 10set b 5set c [expr $a + $b] # 加法运算set d [expr $a - $b] # 减法运算set e [expr $a * $b] # 乘法运算set f [expr $a / $b] # 除法运算```运行以上代码后,变量`c`的值为15,`d`的值为5,`e`的值为50,`f`的值为22.数学函数TCL提供了许多数学函数,可以对数字进行各种计算。
常用的数学函数包括求幂、开方、对数等。
例如:``` tclset x 2set y 3set z [pow $x $y] # 求x的y次幂set sqrtz [sqrt $z] # 对z进行开平方set logz [log $z] # 对z取对数```运行以上代码后,变量`z`的值为8,`sqrtz`的值为2,`logz`的值为2.0793.随机数生成TCL可以生成伪随机数,可以使用`rand`函数生成随机数。
例如:``` tclset randNum [expr rand(] # 生成一个0到1之间的随机数set randInt [expr int(rand(*10)] # 生成一个0到9之间的随机整数```运行以上代码后,`randNum`的值为0到1之间的随机数,`randInt`的值为0到9之间的随机整数。
4.数学常数TCL提供了一些常见的数学常数,如pi和自然常数e,可以直接使用。
tcl语言三个值取最大值的函数

tcl语言三个值取最大值的函数在Tcl语言中,我们可以使用一些方法来找到三个值中的最大值。
以下是一个示例函数,该函数接受三个参数,并返回它们中的最大值:```tclproc findMax {a b c} {set max $aif {$b > $max} {set max $b}if {$c > $max} {set max $c}return $max}# 示例用法set result [findMax 10 5 8]puts '最大值是: $result'```在上面的代码中,`findMax`函数接受三个参数 `a`、`b` 和 `c`,并将 `max` 初始化为 `a` 的值。
然后,我们使用两个 `if` 语句来比较 `b` 和 `c` 是否大于 `max`,如果是的话,我们将 `max` 更新为相应的值。
最后,我们返回 `max` 作为结果。
在示例中,我们调用了 `findMax` 函数,并传入三个数字 `10`、`5` 和 `8`,它返回的结果是 `10`,即这三个数字中的最大值。
然后,我们使用 `puts` 命令将结果打印出来。
这个函数可以很容易地适应更多的参数。
只需在函数定义和 `if` 语句中添加更多的条件即可。
在编写代码时,需要注意:1. 参数的顺序很重要。
根据代码的需求,可以更改参数的顺序。
2. 函数的名称和参数的数量应该根据实际需求来命名,以便在调用时清晰易懂。
3. 可以在函数中添加更多的逻辑和条件,以适应更多的情况。
希望这个示例能帮助你理解如何在Tcl语言中编写一个找到三个值中最大值的函数。
ai_tcl命令集合

AI_TCL命令集合基本命令db2_connect建立数据库连接格式:db2_connect DB名user名password;例子:Set Conn [ db2_connect sccrm dbinst1 dbinst1]AI封装:proc aidb_connect {db username password} {return [db2_connect $db $username $password] }Db2_disconnect删除数据库连接格式:db2_disconnect 数据库连接句柄例子:db2_disconnect $dbhandleAI封装:proc aidb_disconnect {dbhandle} {db2_disconnect $dbhandle# ToDo: write log here}db2_open打开数据库连接格式:db2_open数据库连接句柄例子:db2_open $dbhandleAI封装:proc aidb_open {dbhandle} {set handle [db2_open $dbhandle]return $handle}db2_close断开数据库连接格式:db2_close数据库连接句柄例子:db2_close $dbhandleAI封装:proc aidb_close {dbhandle} {db2_close $handle# ToDo: write log here}db2_exec 执行SQL语句格式:db2_exec数据库连接句柄sql语句例子:db2_exec $dbhandle $sqlstmtAI封装:proc aidb_sql {handle sqlstmt} {db2_exec $handle $sqlstmt#ToDo: write log here}db2_fetchrow执行游标格式:db2_fetchrow 数据库连接句柄例子:db2_fetchrow $dbhandleAI封装:proc aidb_fetch {handle} {return [db2_fetchrow $handle] }db2_commit 事务提交格式:db2_commit 数据库连接句柄例子:db2_commit $dbhandleAI封装:proc aidb_commit {dbhandle} { db2_commit $dbhandle }db2_roll 事务回滚格式:db2_roll 数据库连接句柄例子:db2_roll $dbhandleAI封装:proc aidb_roll {dbhandle} {db2_roll $dbhandle}db2_msg错误信息格式:db2_msg 数据库连接句柄例子:db2_msg $dbhandleAI封装:proc aidb_errcode {dbhandle} {set rc [ db2_msg $handle]if {$rc !=0 && $rc!=100} {if {$rc < 0} {return "-1"} else {return "-2"}}return 0}db2_msg 错误信息格式:db2_msg 数据库连接句柄例子:db2_msg $dbhandleAI封装:proc aidb_errcode {dbhandle} {set rc [ db2_msg $handle]if {$rc !=0 && $rc!=100} {if {$rc < 0} {return "-1"} else {return "-2"}}return 0}其他封装表清空proc aidb_truncate {dbhandle handle table_name} {db2_exec $handle "alter table $table_name activate not logged initially with empty table"db2_commit $dbhandle}建表proc aidb_create_tmptable {dbhandle handle tablename tablelike tablespace tbsindex partitionkey} {db2_exec $handle "create table $tablename like $tablelike \in $tablespace \index in $tbsindex \partitioning key ($partitionkey) \not logged initially"db2_exec $handle "ALTER TABLE $tablename ACTIVATE NOT LOGGED INITIALLY \ LOCKSIZE TABLE"db2_commit $dbhandle}建临时表proc aidb_create_tmptable2 {dbhandle handle tablename fields tablespace tbsindex partitionkey } {db2_exec $handle "create table $tablename ($fields) \in $tablespace \index in $tbsindex \partitioning key ($partitionkey) \not logged initially"db2_exec $handle "ALTER TABLE $tablename ACTIVATE NOT LOGGED INITIALLY \LOCKSIZE TABLE"db2_commit $dbhandle}根据模板建表proc aidb_create_table_as { handle tablename tablelike } {db2_exec $handle "create table $tablename like $tablelike"}变更表名称proc aidb_rename {handle old_tablename new_tablename} {db2_exec $handle "rename table $old_tablename to $new_tablename" }日期增加月份proc ai_addmonths {date mon} {return "$date + $mon months "}日期减少月份proc ai_minusmonths {date mon} {return "$date - $mon months "}日期增加天数proc ai_adddays {date day} {return "$date + $day days"}日期减去天数proc ai_minusdays {date day} { return "$date - $day days" }字符转换成日期proc ai_to_date {date} { return "date('$date')";}日期转换成字符proc ai_to_char {date} { return "$date";}获取系统日期proc ai_sysdate {} {return "current date";}置空proc ai_nvl {s} {return "value($s)"}获取日期的天的值proc ai_day {s} {return "day($s)"}获取日期的月份proc ai_month {s} {return "month($s)"}获取日期的年份proc ai_year {s} {return "year($s)"}字符转换成整数proc ai_int {s} {return "int($s)"}获取两个日期之间的月份差异proc ai_months_between {date1 date2 } {return "year($date1)*12 + month($date1) - year($date2)*12 - month($date2)" }字符转换成double型proc ai_double {s} {return "double($s)"}获取日期的小时数proc ai_hour {s} {return "hour($s)"}字符转换成timestamp型proc ai_char_to_timestamp {s} {return "timestamp('$s')"}proc ai_int_to_int {} {return "integer"}proc ai_short_to_short {} {return "smallint"}proc ai_long_to_long {} {return "bigint"}proc ai_int_to_char {s} {return "char($s)"}。
tcl scan函数 -回复

tcl scan函数-回复Scan函数是Tcl中一个非常有用的命令,它用于在字符串中查找指定的模式并返回匹配的结果。
在本文中,我们将一步一步地回答关于Scan 函数的各种问题,从基本概念到高级用法。
首先,让我们来了解一下Scan函数的基本语法和用法。
Scan函数的基本语法如下:scan string pattern variable参数解释:- `string`:要用来查找的字符串- `pattern`:用于匹配的模式字符串- `variable`:用于存储匹配结果的变量下面是一个简单的例子来说明Scan函数的使用方法:set data "Hello World"scan data "s s" word1 word2这个例子中,我们将字符串"Hello World"存储在变量`data`中,并使用`s`模式将其分解成两个部分。
`word1`会存储"Hello",`word2`会存储"World"。
接下来,让我们深入了解Scan函数的不同模式和其对应的用法。
1. Simple Types(简单类型):- `c`:匹配单个字符- `d`:匹配有符号的十进制整数- `u`:匹配无符号的十进制整数- `x`:匹配十六进制整数- `o`:匹配八进制整数- `f`:匹配浮点数- `s`:匹配字符串- `e`:匹配指数标识的浮点数2. Modifiers(修饰符):- `*`:跳过匹配的内容- `l`:匹配长整数- `h`:匹配短整数- `.`:匹配小数点和数字- `[^...]`:匹配除了指定字符以外的任意字符现在,我们来看一个更复杂一些的例子:set data "My name is John. I am 25 years old."scan data "My name is s. I am d years old." name age在这个例子中,我们使用了字符串"My name is John. I am 25 years old.",并使用`s`模式匹配"John",`d`模式匹配"25"。
TCL教程

↖(^ω^)↗↖(^ω^)↗查看文章TCL语言的一些学习资料TCL语言Tcl tick 的构成-------Tcl是一种很通用的脚本语言,它几乎在所有的平台上都可以解释运行,功能强大。
是tool command language的缩写,发音为"tickle”,实际上包含了两个部分:一个语言和一个库。
首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shell。
它有一个简单的语法和很强可扩充性,Tcl可以创建新的过程以增强其内建命令的能力。
其次,Tcl是一个库包,可以被嵌入应用程序,Tcl的库包含了一个分析器、用于执行内建命令的例程和可以使你扩充(定义新的过程)的库函数。
应用程序可以产生Tcl命令并执行,命令可以由用户产生,也可以从用户接口的一个输入中读取(按钮或菜单等)。
但Tcl库收到命令后将它分解并执行内建的命令,经常会产生递归的调用。
在下面的清单中,将会发现第一个很常见的示例程序,它是用Tcl 实现的。
这是一个完整的脚本:第一行命令调用tclsh 环境,第二行命令执行实际工作。
用您所选择的文本编辑器创建该脚本,输入chmod +x hello.tcl 使之成为可执行文件,然后执行它以测试您这件“作品”。
~/tcltk$ cat hello.tcl#!/usr/bin/tclshputs stdout {Hello, World!}~/tcltk$ ./hello.tclHello, World!Tcl 和Tk 是解释型的、可扩展脚本语言。
与BSD 许可证十分相似,该许可证允许在任何情况下自由使用该软件,只要在所有副本中保留该版权并且在任何分发中一字不差地传递通告。
这个许可证条款使Tcl/Tk 成为自由软件。
Tcl/Tk 是一种解释型环境。
可以通过添加预编译的C 函数来扩展Tcl 解释器,可从Tcl 环境内部调用Tcl 解释器。
可以为特定目的或一般的以及广泛使用的而定制这些扩展。
tcl中的if跟正则表达式

tcl中的if跟正则表达式Tcl中的if语句和正则表达式Tcl是一种脚本语言,它具有简单易学、灵活多样的特点,被广泛应用于各类软件开发项目中。
其中,if语句和正则表达式是Tcl中常用的两个功能强大的特性。
本文将针对这两个主题进行详细介绍和讨论。
一、Tcl中的if语句if语句是一种条件判断语句,用于根据给定的条件执行不同的代码块。
在Tcl中,if语句的基本语法如下所示:if {条件} {# 条件成立时执行的代码块} elseif {条件} {# 第一个条件不成立,但第二个条件成立时执行的代码块} else {# 所有条件都不成立时执行的代码块}if语句的条件可以是一个布尔表达式,也可以是一个变量或函数的返回值。
在Tcl中,字符串的非空和非零值都被视为真,而空字符串和零值被视为假。
因此,我们可以使用if语句来判断变量的值是否符合我们的预期,并根据不同的情况执行相应的操作。
下面是一个简单的示例,演示了如何在Tcl中使用if语句:set num 10if {$num > 0} {puts "变量num的值大于0"} elseif {$num < 0} {puts "变量num的值小于0"} else {puts "变量num的值等于0"}在上面的例子中,我们首先定义了一个变量num,并将其赋值为10。
然后使用if语句判断num的值,并根据不同的情况输出不同的结果。
由于num的值为10,所以输出的结果为"变量num的值大于0"。
二、Tcl中的正则表达式正则表达式是一种强大的模式匹配工具,可以用于在字符串中查找和匹配特定的模式。
在Tcl中,我们可以使用正则表达式来进行字符串的匹配和替换操作。
Tcl中的正则表达式使用的是RE库,它提供了一系列的函数和操作符,用于处理字符串的匹配和替换。
我们可以使用if语句结合正则表达式来判断一个字符串是否符合某种模式,并根据不同的情况执行相应的操作。
Tcl库函数

目 录75总结...................................................................54分析函数................................................................33命令生成和删除函数及结果处理函数...........................................22解释器的生成和删除及TCL 脚本的求值函数......................................21初始化函数.. (11)9TCL 库函数的最新情况....................................................108字符串操作函数.........................................................97Hash 表操作函数..........................................................76访问TCL 变量的函数.......................................................TCL库函数介绍(一)关键词:TCL摘要:本文旨在推广TCL的使用,通过分类介绍TCL的库函数的用法,让用户了解怎样利用这些库函数去编写TCL扩展命令。
为了让用户能方便地扩展TCL命令,TCL为用户提供了大量的库函数供用户使用,满足用户各方面的需要。
用户可以在用C\C++语言编写扩展的TCL命令过程或函数时,调用这些库函数。
要真正理解这些库函数的用法,最佳途径是参照一些例子,并实际使用。
在我的一篇文档《TCL的使用》中有一些这些函数的使用的例子。
下面分类对TCL的库函数进行介绍。
1初始化函数这组函数用于用户初始化应用。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目 录75总结...................................................................54分析函数................................................................33命令生成和删除函数及结果处理函数...........................................22解释器的生成和删除及TCL 脚本的求值函数......................................21初始化函数.. (11)9TCL 库函数的最新情况....................................................108字符串操作函数.........................................................97Hash 表操作函数..........................................................76访问TCL 变量的函数.......................................................TCL库函数介绍(一)关键词:TCL摘要:本文旨在推广TCL的使用,通过分类介绍TCL的库函数的用法,让用户了解怎样利用这些库函数去编写TCL扩展命令。
为了让用户能方便地扩展TCL命令,TCL为用户提供了大量的库函数供用户使用,满足用户各方面的需要。
用户可以在用C\C++语言编写扩展的TCL命令过程或函数时,调用这些库函数。
要真正理解这些库函数的用法,最佳途径是参照一些例子,并实际使用。
在我的一篇文档《TCL的使用》中有一些这些函数的使用的例子。
下面分类对TCL的库函数进行介绍。
1初始化函数这组函数用于用户初始化应用。
1.Tcl_Init函数原型: int Tcl_Init (Tcl_Interp *interp)参数interp是一个指向TCL解释器的指针。
Tcl_Init函数只作一些简单的初始化工作,没多大的用处。
不过,用户一般需要提供自己的初始化函数,原型与Tcl_Init一样,在这个函数中,要作应用的初始化工作,如注册自己的TCL扩展命令,生成自己需要的数据对象等。
这个函数必须在生成TCL解释器后才能调用。
生成TCL解释器可以调用Tcl_CreateInterp函数,另外Tcl_Main函数中也会自动生成TCL解释器。
2.Tcl_Main函数原型:void Tcl_Main (int argc, char **argv,Tcl_AppInitProc *appInitProc)如果用到这个函数的话,应该在你的C\C++程序的main函数中调用,它的前两个参数和main函数的两个参数一样,第三个参数是一个函数指针,指向一个初始化函数,其原型和Tcl_Init一样。
如果程序没有任何命令行参数,Tcl_Main调用appInitProc初始化函数,并启动一个TCL的命令解释循环,建立一个交互环境,等待你输入TCL命令和脚本并解释执行。
如果程序有命令行参数,那它先调用appInitProc函数作一些初始化工作,然后把第一个命令行参数作为TCL脚本文件名,并求值返回,其余参数不予理会。
2解释器的生成和删除及TCL脚本的求值函数这组函数提供生成和删除TCL解释器及对TCL脚本进行求值的功能。
每一个TCL应用,都必须拥有至少一个TCL解释器,事实上几乎所有的TCL库函数都有一个指向TCL解释器的指针的参数。
每一个扩展的TCL命令都和特定的TCL解释器相关联,只有在对该命令进行了注册的TCL解释器中,这个命令才是有效的,才能被解释执行。
1.Tcl_CreateInterp函数原型:Tcl_Interp *Tcl_CreateInterp(void)这个函数生成一个新的TCL解释器,并返回指向这个解释器的指针。
2.Tcl_DeleteInterp函数原型:void Tcl_DeleteInterp(Tcl_Interp *interp)这个函数删除一个TCL解释器,并会触发用户定义的回调函数,作一些善后工作。
3. Tcl_Eval函数原型: int Tcl_Eval(Tcl_Interp *interp char *script)这个函数在解释器interp中求脚本script的值并返回执行情况。
结果和错误信息保存在interp->result中。
函数返回值表示执行情况,为以下五个值之一:TCL_OK :表示执行成功TCL_ERROR:表示执行过程中遇到了不可克服的错误TCL_BREAK:表示break命令被激活TCL_CONTINUE :表示conitinue命令被激活TCL_RETURN:表示return 命令被激活事实上所有int型的TCL库函数都以上述值为返回值,TCL_OK和TCL_ERROR最常用,后面三个只是当用户需要实现自己的控制流才会用到。
下面介绍的库函数就不再介绍返回值。
4. Tcl_EvalFile 函数原型:int Tcl_EvalFile(Tcl_Interp *interp, char *fileName)这个函数在解释器interp中求脚本文件fileName的值并返回执行情况。
结果和错误信息保存在interp->result中。
5. Tcl_GlobalEval函数原型:int Tcl_GlobalEval(Tcl_Interp *interp, char *script)这个函数在解释器interp中在全局层次上求脚本script的值并返回执行情况。
结果和错误信息保存在interp->result中。
6. Tcl_VarEval函数原型:int Tcl_VarEval(Tcl_Interp *interp, char *string, char *string,... (char *) NULL)这个函数具有可变个数参数,必须以NULL作为最后一个参数,标记参数结束,它把所有的字符串参数合并成一个,在解释器interp中求它的值并返回执行情况。
结果和错误信息保存在interp->result中。
3命令生成和删除函数及结果处理函数这组函数用于生成和注册用户自己定义的TCL扩展命令及管理TCL命令的结果。
用户只有自己用C\C++语言编写了定义TCL命令的函数或过程,并注册,才能被解释器所识别和使用。
这里还应该区分两个概念:TCL命令结果和定义命令的C\C++函数或过程的返回值。
命令结果是执行TCL命令后,TCL解释器返回的命令执行结果,形式为字符串;而定义命令的C\C++函数或过程的返回值指的是我们编写的用来定义TCL命令的C\C++函数或过程的返回值,这些返回值已经在Tcl_Eval函数的说明中介绍了。
TCL命令的结果需要我们在定义TCL命令的C\C++函数或过程中给出,如果我们希望TCL命令执行后返回某个值,只要把这个值以字符串形式存入interp->result中,TCL解释器就会在执行这个命令后返回这个字符串形式的值。
1. Tcl_CreateCommand函数原型:void Tcl_CreateCommand(Tcl_Interp * interp, char * cmdName,Tcl_CmdProc * cmdProc, ClientData clientData,Tcl_CmdDeleteProc * deleteProc)这个函数在解释器interp中生成一个命令,并把它注册到这个解释器。
这样这个命令在这个解释器中就可以和TCL固有命令一样使用。
函数的第一个参数指向TCL解释器,第二个参数是一个字符串,代表命令名,第三个参数是一个函数指针,指向你用C\C++写的定义该命令的函数或过程,第四个参数指向你希望传给你的函数或过程的数据对象,第四个参数也是一个函数指针,指向一个回调函数,当你删除这个命令时,解释器会自动激活这个过程。
tcl.h中对Tcl_CmdProc的定义如下:typedef int Tcl_CmdProc(ClientData clientData,Tcl_Interp *interp, int argc,char *argv[]);其中:typedef void * ClientData;每一个用C\C++写的定义命令的函数或过程必须为上面的形式:第一个参数实际上是一个void指针,可以指向任何数据类型,这里指向用户需要传给那些函数或过程的数据对象,第二个参数指向解释器,第三个参数代表这个命令的参数个数(包括命令名本身),第四个参数是一个字符串数组,其中保存各个参数的字符串形式的值。
返回值为整数,只能为 TCL_OK、TCL_ERROR 、TCL_BREAK、TCL_CONTINUE 、TCL_RETURN其中之一,这在上面已经介绍过。
2. Tcl_DeleteCommand函数原型: int Tcl_DeleteCommand(Tcl_Interp *interp, char *cmdName)这个函数从解释器中删除一个命令,同时激活该命令对应的回调函数。
我们在利用C\C++编写TCL扩展命令过程时,一般可以通过把interp->result指向一个字符串或使用 sprintf 函数来设置命令的执行结果。
但是interp->result的缺省大小只有200字节,如果命令结果太长就会出错。
因此TCL提供了以下库函数来供用户管理命令结果:3. Tcl_SetResult 函数原型:Tcl_SetResult(Tcl_Interp *interp, char *string,Tcl_FreeProc* freeProc)这个函数的第一个参数是一个TCL解释器,第二个参数是一个将作为命令结果的字符串,第三个参数是一个函数指针,定义如下:typedef void (Tcl_FreeProc)(char *blockPtr)第三个参数的值可以为:TCL_STATIC :这表示string是静态的,Tcl_SetResult只简单的把它的指针存入interp->result TCL_VOLATITLE:表示string会改变,Tcl_SetResult会把它复制到interp->result,如果string太长,会重新分配内存。
TCL_DYNAMIC:表示string是用malloc分配的内存,并成为TCL的一个属性:Tcl_SetResult 将把interp->freeproc设置 free 以释放内存。