第3讲 语法规则

146 阅读4分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第38天,点击查看活动详情

第3讲 语法规则

区分大小写

  • 区分大小写

    • 变量名(局部变量、全局变量和进程私有全局变量)
    • 变量下标
    • 类名
    • 方法名
    • 属性名
    • 属性的实例变量的i%
    • 例程名
    • 宏名
    • 宏包含文件(.inc文件)名
    • 标签名
    • 锁名
    • 嵌入式代码指令标记字符串、
    • 嵌入式SQL主机变量名。
  • 不区分大小写

    • 命令名
    • 函数名
    • 特殊变量
    • 命名空间名
    • sql语句
    • 预处理器指令(如#include)
    • 嵌入式代码指令(&html、&js和&sql)

空格

空格视为语法上有意义的。除非另有说明,否则空白指的是空格、制表符和换行符。

不需要空格

  • 标签(也称为标记或入口点):标签必须出现在第一列,前面没有空格字符。如果一行有标签,则标签与该行上的任何代码或注释之间必须有空格。如果标签有参数列表,则在标签名称和参数列表的左括号之间不能有空格。参数列表中的参数之前、之间或之后可以有空格。

  • 多行注释:多行注释的第一行前面必须有一个或多个空格。多行注释的第二行和后续行不需要前导空格。

 /* 
asd */

需要空格

  • 命令及其第一个参数之间必须且只有一个空格
s yx = "yx"
 s yx = "yx"
  • 如果命令使用后置条件,则命令与其后置条件之间没有空格。
 q:yx '= ""
 q:(yx '= "")
  • 在任何一对命令参数之间可以有任意数量的空格。
 if yx = ""       s yx = "yao xin"
  • 如果一行包含代码,然后是单行注释,则它们之间必须有空格。
 s yx = "yx"//注释
 s yx = "yx" //注释`
  • 通常,每个命令都显示在自己的行上,不过可以在同一行上输入多个命令。在这种情况下,它们之间必须有空格;
 yx = "yx"   w "1"   
  • 如果一个命令是无参数的,那么它后面必须跟两个空格。
 l  w "11"
  • CachéStudio提供内置的语法检查,因此它将标记任何非法使用的空格。

注释

  • /**/ 注释 可以显示在一行内,也可以跨行显示。
  • // 注释 指定该行的其余部分是注释;它可以是该行的第一个元素,也可以跟在其他元素之后。
  • ; 注释 指定该行的其余部分为注释;它可以是该行的第一个元素,也可以跟在其他元素之后。
  • ;; 注释 ;注释类型的特殊类型。(不推荐)
  • /// 注释用作紧随其后的类或类成员的类引用内容。对于类本身,类定义开始之前的///注释提供类引用内容的类描述,这也是类的Description关键字的值)。

(注意:因为Caché在目标代码(实际解释和执行的代码)中保留了;;注释,所以包含它们会影响性能,并且它们不应该出现在循环中。)

/// 注释描述
/// d ##class(YX.First).Comment()
ClassMethod Comment()
{
	w $p("apple,banana,organe" /* 水果 */,",",2),!
	w "apple",/* 水果" */" banana",!
	s x = "organe"/* 水果" */ WRITE x,!
	w "organe"/* 水果" */ // "其他注释"
}
DHC-APP>d ##class(YX.First).Comment()
banana
apple banana
organe
organe

文字值

文字值就是组成变量的表达式,由一系列表示特定字符串或数值的字符组成的常量值

	s x = "hello"
	s y = 10

字符串

  • 最大字符串大小是可配置的。如果启用了长字符串,则最大字符串大小为3,641,144个字符。否则,最大字符串大小为32,767个字符。默认情况下启用长字符串。
  • 字符串文字是由引号包含的一组零个或多个字符
  • 字符串可以包含任何字符,包括空格和控制字符。字符串文字的长度以字符串中的字符数而不是字节数来度量。
	s str ="这是一个字符串"
	w $l(str),!
	s str ="this is a string"
	w $l(str),!
  • 所有字符串都可以输入的。可以使用$CHAR函数指定不可输入的字符.
	s str = "abc"
	w str,!
	zzdump str
	
	s str = $c(945) _ $c(946) _ $c(947)
	w str,!
	zzdump str
  • 并非所有字符串字符都可显示。它们可以是非打印字符或控制字符。
	s str = "a" _ $c(0) _ "b" _ $c(9) _ "c" _ $c(10, 13) _ "d"
	w !!,str,!
	w $l(str),!
	zzdump str
  • 要在字符串中包含引号字符(“),请将字符加倍
	s str = """"""
	w !!,str,!
	w $l(str),!
	zzdump str
  • 不包含任何值的字符串称为空字符串。它由两个引号字符("")表示。空字符串被视为已定义的值。它的长度为0,空字符串与由空字符($CHAR(0))组成的字符串不同
	s str = ""
	w "空字符串:" _ $l(str),!
	
	s str = $c(0)
	w "$c(0)字符串:" _ $l(str),!

数字

数字文字值是ObjectScript计算为数字的值。

/// d ##class(YX.First).Number()
ClassMethod Number()
{
	s x = +++00008.000
	w "数字长度:", $l(x),!
	w "数字值:" , x,!
	w "相等:" , x = 8,!
	w " + 1:" , x + 1,!
}

数字字符串表示为用引号括起来的字符串数字。

	s x = "+++00008.000"
	w "数字长度:", $l(x),!
	w "数字值:" , x,!
	w "相等:" , x = 8,!
	w " + 1:" , x + 1,!
数量
数字0-9任何数量,但至少有一个。
符号运算符:减号(-)和加号(+)。任何数量,但必须在所有其他字符之前。
小数分隔符字符(默认情况下为句点或小数点字符;在欧洲区域设置中为逗号字符)。最多一个。
字母“E”(用于科学记数法)。最多一个。必须出现在两个数字之间。

科学记数法:用指数记数法表示的数字。

	w 3.5E10,!

标识符

  • 标识符是变量、例程或标签的名称。通常,合法标识符由字母和数字字符组成,标识符区分大小写。
  • 标识符的第一个字符可以是百分号(%)字符。以%字符开头的名称保留为系统元素。
  • Caché中没有保留字;可以使用任何有效的标识符作为变量名、函数名或标签。
  • 最好避免使用命令名、函数名或其他此类字符串的标识符。
  • ObjectScript代码包括对嵌入式SQL的支持,避免使用SQL保留字命名任何函数、对象、变量或其他实体。

标签

标签即子例程

标签具有以下命名约定:

  • 第一个字符必须是字母数字字符或百分比字符(%)。
  • 它们最长可达31个字符。标签可以长于31个字符,但在前31个字符内必须是唯一的。标签引用仅与标签的前31个字符匹配。
  • 区分大小写。
/// d ##class(YX.First).Number()
ClassMethod Label()
{
yao
XIN
31yao
%xin
}
  • 可以使用$ZNAME函数来验证标签名称。验证标签名称时,请不要使用参数括号。
	w $zname("%xin")
	w $zname("#%xin")

注意:标签提供入口点,但它没有定义封装的代码单元。这意味着一旦标记的代码执行,执行将继续到下一个标记的代码单元,除非执行被停止或重定向到其他地方。

/// d ##class(YX.First).Label()
ClassMethod Label()
{
	s x = $random(2)
	if x=0 {
		d label0
		w "label0结束",!
		q
	} else {
		d label1
		w "label1结束",!
		q
	}
label0
  w "label0内 开始",!

  w "label0外 结束",!
label1
  w "label1内 开始",!

  w "label1外 结束",!
}

有三种方法可以停止执行代码单元:

  • 执行遇到退出或返回 ( QUIT or RETURN )。
  • 执行遇到尝试的右大括号(“}”)。发生这种情况时,执行将从关联的CATCH块后面的下一行代码继续执行。
  • 执行遇到下一个过程块(带有参数括号的标签)。遇到带括号的标签行时,即使括号内没有参数,执行也会停止。