Show/Hide Toolbars

XSharp

 

CODEBLOCK(代码块)类型是在 Clipper 时代的 XBase 语言中引入的。

 

它们可以被看作是无名函数。它们可以有 0 个或多个参数,并返回一个值。

 

最简单的返回字符串字面值的代码块如下所示:

FUNCTION Start() AS VOID
LOCAL cb AS CODEBLOCK
cb := {|| "Hello World"}
? Eval(cb)
WAIT
 
RETURN

要使用 CODEBLOCK(代码块),您需要调用 Eval() 运行时函数。

 

CODEBLOCK(代码块)不限于固定表达式,因为它们可以使用参数。

 
以下CODEBLOCK(代码块)添加了 2 个参数:

FUNCTION Start() AS VOID
LOCAL cb AS CODEBLOCK
cb := {|a,b| a + b}
? Eval(cb, 1,2)
? Eval(cb, "Helllo ", "World")
WAIT
RETURN

正如您在示例中所看到的,我们既可以在这里使用数字参数,也可以使用字符串参数。两者都可以。这是因为代码块的参数属于所谓的 USUAL 类型。它们可以包含任何值。当然,以下操作将失败,因为 USUAL 类型不支持字符串相乘:

FUNCTION Start() AS VOID
LOCAL cb AS CODEBLOCK
cb := {|a,b| a * b}
? Eval(cb, 1,2)
? Eval(cb, "Helllo ", "World")
WAIT
RETURN

更复杂的 codeblock

代码块不仅限于单个表达式。

 
它们也可以包含一个(逗号分隔的)表达式列表。最后一个表达式的值是代码块的返回值。

FUNCTION Start() AS VOID
LOCAL cb AS CODEBLOCK
cb := {|a,b,c| QOut("value 1", a) , QOut("value 2", b), QOut("value 3", c), a*b*c}
? Eval(cb,10,20,30)
WAIT
RETURN

XSharp 还引入了包含语句列表的代码块:

FUNCTION Start() AS VOID
LOCAL cb AS CODEBLOCK
cb := {| a,b,c|  
  ? "value 1" ,a
  ? "value 2" ,b
  ? "value 3" ,c
  RETURN a*b*c
  }
? Eval(cb,10,20,30)
WAIT
RETURN

注意

第一条语句应从参数列表后的新行开始。

参数列表后不应有分号。

语句列表应以 RETURN 语句结束。

 

 

实现

CODEBLOCK 类型在抽象类 XSharp.Codeblock 中实现。

 

CODEBLOCK 的 Usualtype 值为 9。

 

 

在你的代码中,永远不会有 XSharp.Codeblock 类型的对象。

 

编译时代码块被转化为 XSharp.Codeblock 的子类。

 

运行时(宏编译)代码块被转换为 XSharp._Codeblock 类的子类,该类继承于 Codeblock。

 
根据运行时代码块的类型,它要么是宏代码块(MacroCodeblock)类的实例,要么是宏内存变量代码块(MacroMemVarCodeblock)类的实例(当宏创建动态内存变量时)。