跳至内容

Rexx 编程/Rexx 指南/子程序

来自维基教科书,开放的书籍,构建开放的世界

“过程”或“子程序”是代码中独立的部分,执行特定任务。它们是大型程序中的小型程序。我们可以在代码中使用 CALL 语句激活它们。子程序可以使用 RETURN 语句表示它已完成其任务。

/* Call subroutines to make different animal noises. */
 call BarkFiveTimes
 call MeowThreeTimes
 call MooEightTimes
 exit
BarkFiveTimes:
 do 5
  say "Woof!"
 end
 return
MeowThreeTimes:
 do 3
  say "Meow!"
 end
 return
MooEightTimes:
 do 8
  say "Moo!"
 end
 return

解析参数

[编辑 | 编辑源代码]

理想情况下,子程序应该足够灵活以响应各种情况。我们应该能够将一个或多个数据片段馈入子程序以修改其行为。这些数据片段称为“参数”,你可以将它们包含在 CALL 语句中。它们可以使用 PARSE ARG 语句分配给子程序中的变量。

/* Bark or meow as many times as you want. */
 call Bark 5
 call Meow 3
 exit
Bark:
 parse arg bark_count
 do bark_count
  say "Woof!"
 end
 return
Meow:
 parse arg meow_count
 do meow_count
  say "Meow!"
 end
 return

局部变量

[编辑 | 编辑源代码]

由于在不同的子程序中使用不同的变量名来表示相同的目的很烦人,我们可以使用 PROCEDURE 关键字使函数完全独立。它将有自己的变量,这些变量不会与程序中其他地方的变量冲突,即使它们具有相同的名称。

 call Bark 5
 call Meow 3
 exit
Bark:
 procedure
 parse arg count
 do count
  say "Woof!"
 end
 return
Meow:
 procedure
 parse arg count
 do count
  say "Meow!"
 end
 return

代码重用

[编辑 | 编辑源代码]

只要你在程序的不同部分看到相同类型的代码,你可能就有一个可以在过程中设置的单个流程。这样,任何错误都只需在一个地方纠正一次。

/* Make any animal noise as many times as you want. */
 call MakeNoise "Woof!", 5
 call MakeNoise "Meow!", 3
 call MakeNoise "Moo!", 8
 exit
MakeNoise:
 procedure
 parse arg noise, count
 do count
  say noise
 end
 return

返回值

[编辑 | 编辑源代码]

子程序不仅可以从调用它们的程序部分接收值,而且它们在完成时也可以将数据发回。子程序通过在 RETURN 语句中包含数据来返回数据片段,之后它将在名为 RESULT 的变量中可用。

/* Use a subroutine to convert angle measures. */
 say "Enter a number of degrees:"
 pull number
 call GetRadians number
 say number "degrees is the same as" result "radians."
 exit
GetRadians:
 procedure
 parse arg degrees
 pi = 3.14159
 return pi * degrees / 180

作为调用子程序和访问结果的两个不同语句的捷径,可以使用本书函数部分中描述的单行符号(使用括号)。

 say "Enter a number of degrees:"
 pull number
 say number "degrees is the same as " GetRadians(number) "radians."
 exit

顺便说一下,如果你希望参数在进入子程序时大写,或者如果你不关心字母的大小写,因为参数是数字,你可以省略 PARSE 关键字。

GetRadians:
 procedure
 arg degrees
 pi = 3.14159
 return pi * degrees / 180

公开变量

[编辑 | 编辑源代码]

如果你希望过程只部分独立,可以使用 EXPOSE 关键字让它访问特定的全局变量。这在需要在程序的不同部分之间共享一些数据时很有用。

/* Use the same value of pi to perform different circle computations. */
 PI = 3.14159
 call CircleArea 10
 say "The area of a circle with radius 10 is" result"."
 call Circumference 50
 say "The circumference of a circle of diameter 50 is" result"."
 exit
CircleArea:
 procedure expose PI
 arg radius
 return PI * radius ** 2
Circumference:
 procedure expose PI
 arg diameter
 return PI * diameter

子程序也可以调用自身并接收自己的返回值。效果类似于循环,如果子程序需要重新开始并尝试其他操作,也许使用稍微不同的数据,以便完成其原始任务,这将很有用。

/* First 10 triangular numbers */
 call ShowTriangulars 10
 exit
ShowTriangulars:
 procedure
 arg how_many
 if how_many > 0 then do
  one_less = how_many - 1
  call ShowTriangulars one_less
  say Triangular(how_many)
 end
 return
Triangular:
 procedure
 arg which?
 if which? > 1 then do
  previous = which? - 1
  return Triangular(previous) + which?
 end
 return 1

如果你期望函数重复自身数百次或数千次,你可能最好在函数内部编写一个循环。如果同一个函数在返回之前调用自身太多次,程序可能会崩溃。

华夏公益教科书