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