第2讲 初识M程序

172 阅读4分钟

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

第2讲 初识M程序

语言概述

  • 变量名称,类名称和方法名称区分大小写。
  • 语句不能从一行的第一个字符位置开始。
  • 所有命令都必须缩进。注解也必须缩进。
  • 大多数ObjectScript命令(以及许多函数和特殊变量)都有长形式和短(缩写)形式(通常是一个或两个字符)

/// d ##class(YX.First).Command()
ClassMethod Command()
{
	set yx = "姚鑫"
	write yx,!
	
	s yx = "姚鑫"
	w yx,!
}

  • s是set命令的缩写,是赋值定义变量命令,将yx值为姚鑫。
  • w是write命令的索引,是显示yx变量的值。

变量

  • 在ObjectScript中,变量是可以内存运行时值的位置的名称。也就是说变量存在内存中。
  • 必须使用SET命令定义变量,但不必指定类型。也可以理解为泛型。
  • 变量是非类型化的;也就是说,它们没有指定的数据类型,可以接受任何数据值。
  • 支持的几种变量:
    • 局部变量 - 只有创建它的Caché进程才能访问的变量,该变量在进程终止时自动删除。局部变量可以从任何命名空间访问。
    s name = "yao xin"
    
    • 进程私有全局变量 - 仅可由Caché进程访问并在进程结束时删除的变量。进程私有全局可以从任何名称空间访问。进程私有全局变量对于临时存储大数据值特别有用。
    s ^||yx = "yao xin"
    
    • 全局变量 - 存储在Caché数据库中的永久变量。全局可以从任何进程访问,并在创建它的进程终止后持续存在。全局变量特定于单个命名空间。
    s ^yx = "yao xin"
    
    • 数组变量 - 具有一个或多个下标的变量。所有用户定义的变量都可以用作数组,包括局部变量、进程私有全局变量、全局变量和对象属性。
     s color("red")  = "red"
     s color("yellow")  = "yellow"
     s color("green")  = "green"
    
    • 特殊变量(也称为系统变量) 一组特殊的内置变量之一,其中包含Caché操作环境的特定方面的值。Caché定义了所有特殊变量;Caché将所有特殊变量设置为初始值(有时为空字符串值)。一些特殊变量可以由用户设置,其他变量只能由caché设置。特殊变量不是数组变量。
    	w $zversion
     w $namespace
    
    • 对象属性 - 与对象的特定实例相关联并存储在其中的值。
    Property name As %String;
    
     /// d ##class(YX.First).Variable()
     ClassMethod Variable()
     {
     	s mYx = ..%New()
     	s mYx.name = "姚鑫"
     	w mYx.name,!
     }
    

表达式

  • 表达式是可以计算为生成单个值的任何标记集
/// d ##class(YX.First).Expression()
ClassMethod Expression()
{
	s name = "yao xin"
	w name,!
	w 1 + 2,!
	w $l(name),!
	w $zversion
}

函数

  • 函数是执行操作(例如,将字符串转换为其等效的ASCII代码值)并返回值的例程。在命令行中调用函数。此调用向函数提供参数值,该函数使用这些参数值执行某些操作。然后,该函数向调用命令返回单个值(结果)。可以在任何使用表达式的地方使用函数。

(一般例程里叫做函数,类里叫做方法。)

  • Caché提供了大量的系统函数,不能修改这些函数。这些函数美元符号(“$”)开头,参数括在括号中;即使没有指定参数,括号也是必需的。

(特殊变量名也以单个美元符号开头,但没有括号。)

  • 许多系统提供的函数名称都有缩写。

/// d ##class(YX.First).Funciton()
ClassMethod Funciton()
{
	s yx = $length("姚鑫")
	w "全拼" _ yx,!
	
	s yx = $l("姚鑫")
	w "缩写" _ yx,!
}

  • 函数总是返回值。通常,此返回值被提供给命令。
  • 在一些函数中,不需要为返回值提供接收者。可以用do 或 job命令
d $classmethod("YX.First","Command")
  • 一个函数可以没有参数、单个参数或多个参数。函数参数是位置参数,用逗号分隔。许多参数是可选的。如果省略某个参数,Caché将使用该参数的默认值。由于参数是位置参数,因此通常不能省略指定参数列表中的参数。
	s yx = "姚鑫是一名开发工程师"
	
	w "省略参数默认截取第一个参数" _ $e(yx),!
	
	w "截取第一个字符:" _ $e(yx, 1),!
	
	w "截取一到二个字符:" _ $e(yx, 1 , 2),!
  • 通常,参数可以指定为字符串、变量或另一个函数的返回值。在少数情况下,参数必须作为字符串提供。
ClassMethod GetStr()
{
	q "姚鑫是一名开发工程师"
}
	w "参数为字符串:" _ $e("姚鑫是一名开发工程师",1),!
	
	w "参数变量:" _ $e(yx, 2),!
	
	w "参数另一个函数的返回值:" _ $e(..GetStr(), 3),!
  • 大多数情况下,必须先定义变量,然后才能将其指定为函数参数,否则会生成错误。在少数情况下,不必定义参数变量。
	w "没有定义变量:" _ $d(str),!
	
	s str = 0
	
	w "定义变量:" _ $d(str),!
  • 函数参数是向函数提供值的输入参数。函数不修改作为输入参数提供的变量的值。在少数情况下,函数既返回值又设置输出参数。
	s color = "red,green,yellow"
	w "未修改color变量:" _ color,!
	
	s $p(color, ",", 1) = "write"
	
	w "修改color变量:" _ color,!