若要在巨集中定義自己的函數,請使用 FUNCTION 區塊或 MACRO_FUNCTION 區塊:
語法:使用下列語法來定義函數:
FUNCTION 區塊:
%FUNCTION(type) function-name([usage] [datatype] parameter, ...) [RETURNS(return-var)] {
executable-statements
[report-block]
...
[report-block]
[message-block]
%}
MACRO_ FUNCTION 區塊:
%MACRO_FUNCTION function-name([usage] parameter, ...) [RETURNS(return-var)] {
executable-statements
report-block
...
report-block
%}
其中:
您可以使用相同名稱來定義多個 FUNCTION 或 MACRO_FUNCTION 區塊, 以便同時處理它們。每一個區塊皆必須有相同的參數列示。 當 Net.Data 呼叫函數時,相同名稱的所有 FUNCTION 區塊或相同名稱的 MACRO_FUNCTION 區塊,會按它們在 Net.Data 巨集中定義時的次序來執行。
對於 FUNCTION 區塊,Net.Data 會以變數值來置換所有的變數參照、 執行所有的函數呼叫,並在可執行的陳述式傳送至語言環境之前, 以結果值來置換函數呼叫。 每一個語言環境以不同的方式處理陳述式。 有關指定可執行的陳述式或呼叫可執行的程式,請參閱"執行變數"。
對於 MACRO_FUNCTION 區塊, 可執行的陳述式是文字和 Net.Data 巨集語言結構的組合。 此情況下,不會包括任何語言環境,因為 Net.Data 扮演語言處理器的角色, 且會處理可執行的陳述式。
在 Net.Data 巨集中呼叫函數之前,請先在任何其他區塊外定義它們。
當符合 Net.Data 語言結構語法的字元在函數區塊的語言陳述式區段中使用, 作為語法有效的內含程式碼 (如 REXX 或 Perl) 的一部份時, 它們可能會被誤譯為 Net.Data 語言結構,導致在巨集中發生錯誤或無法預期的結果。
例如,Perl 函數可以使用 COMMENT 區塊定界字元 (%{)。 當巨集執行時,%{ 字元會被解譯為 COMMENT 區塊的開頭。然後, Net.Data 會尋找 COMMENT 區塊的結尾,當它讀到函數區塊的結尾時, 會認為找到它。Net.Data 會繼續尋找函數區塊的結尾,當它找不到時, 即會發出錯誤。
使用下列其中一種方法,使用 COMMENT 區塊定界字元或任何其他 Net.Data 特殊字元, 作為內含程式碼的一部份,不使它們被 Net.Data 解譯為特殊字元:
例如,下列 Perl 函數含有代表 COMMENT 區塊定界字元 %{ 作為 Perl 語言陳述式一部份的字元:
%FUNCTION(DTW_PERL) func() {
...
for $num_words (sort bynumber keys %{ $Rtitles{$num} }) {
&make_links($Rtitles{$num}{$num_words});
}
...
%}
若要確定 Net.Data 將 %{ 字元解譯為 Perl 原始碼而非 Net.Data COMMENT 區塊定界字元, 請以下列任一方式重寫函數:
%FUNCTION(DTW_PERL) func() {
%EXEC{ func.prl %}
%}
%define percent_openbrace = "%{"
%FUNCTION(DTW_PERL) func() {
...
for $num_words (sort by number keys $(percent_openbrace) $Rtitles{$num} } {
&make_links($Rtitles{$num}{$num_words});
}
...
%}
MESSAGE 區塊可讓您決定在順利完成 (或未順利完成) 函數呼叫後, 要如何繼續處理,並且可讓您顯示相關資訊給函數呼叫者。 當處理訊息時,Net.Data 會為呼叫 FUNCTION 區塊的每一個函數, 設定一個語言環境變數 RETURN_CODE。 不會在 MACRO_FUNCTION 區塊的函數呼叫上設定 RETURN_CODE。
MESSAGE 區塊是由一系列的訊息陳述式所組成, 每個陳述式都設有回覆碼值、訊息文字與要執行的動作。 有關 MESSAGE 區塊的語法,請參閱 Net.Data 參考手冊中語言結構一章
MESSAGE 區塊的範圍可以是廣域或區域。若 MESSAGE 區塊是定義在 FUNCTION 區塊中,則對該 FUNCTION 區塊來說其範圍是區域性的。 若它是指定在最外層的巨集上,則 MESSAGE 區塊的範圍是廣域的, 且可供在 Net.Data 巨集中執行的所有函數呼叫使用。 如果您定義多個廣域 MESSAGE 區塊,則會採用最近一次定義的。
Net.Data 會採用下列的規則,來處理從某函數呼叫所傳回的 RETURN_CODE 變數之值:
下列範例顯示一部份 Net.Data 巨集,其中帶有整體 MESSAGE 區塊, 與一個函數的 MESSAGE 區塊。
%{ 廣域 message 區塊 %}
%MESSAGE {
-100 : "回覆碼 -100 訊息" : exit
100 : "回覆碼 100 訊息" : continue
+default : {
此為超出一行的長訊息。
您可以在此訊息中使用 HTML 標籤,包括
鏈結與套表。%} : continue
%}
%{ FUNCTION 區塊中的區域 message 區塊 %}
%FUNCTION(DTW_REXX) my_function() {
%EXEC { my_command.mbr %}
%MESSAGE {
-100 : "回覆碼 -100 訊息" : exit
100 : "回覆碼 100 訊息" : continue
-default : {
此為超出一行的長訊息。
您可以在此訊息中使用 HTML 標籤,包括
鏈結與套表。%} : exit
%}
my_function() 傳回一個 RETURN_CODE 值為 50 時, Net.Data 會以下列順序來處理錯誤:
當 Net.Data 找到相配時, 會將訊息文字送給 Web 瀏覽器,並檢查所要求的動作。
當您設定 continue 時, Net.Data 會在印出訊息文字後繼續處理 Net.Data 巨集。 例如, 若巨集呼叫 my_functions() 5 次,且在處理範例中之 MESSAGE 區塊時發現了錯誤 100, 則該程式的輸出如下:
. . . 11 May 1997 $245.45 13 May 1997 $623.23 19 May 1997 $ 83.02 回覆碼 100 訊息 22 May 1997 $ 42.67 總計: $994.37