##function
説明
このマクロ・プリプロセッサ関数は、コンパイル時に ObjectScript 関数を評価します。以下の形式をとります。
##function(content)
ここで、content は ObjectScript 関数で、ユーザ定義にできます。##function は、関数からの返り値で ##function(content) を置き換えます。
以下の例は、ObjectScript 関数から値を返します。
#define alphalen ##function($LENGTH("abcdefghijklmnopqrstuvwxyz"))
WRITE $$$alphalen
以下の例では、GetCurrentTime.mac ファイルにユーザ定義関数があるとします。
Tag1()
KILL ^x
SET ^x = """" _ $Horolog _ """"
QUIT ^x
以下に示すように、ShowTimeStamps.mac と呼ばれる別個のルーチンでこのコードを呼び出すことができます。
Tag2
#define CompiletimeTimeStamp ##function($$Tag1^GetCurrentTime())
#define RuntimeTimeStamp $$Tag1^GetCurrentTime()
SET x=$$$CompiletimeTimeStamp
WRITE x,!
SET y=$$$RuntimeTimeStamp
WRITE y,!
ターミナルでの出力は、以下のようになります。
USER>d ^ShowTimeStamps
64797,43570
"64797,53807"
USER>
ここで、出力の最初の行は、コンパイル時の $Horolog の値で、2 行目は、実行時の $Horolog の値です (出力の最初の行は引用符で囲まれておらず、2 行目は囲まれています。これは、x がその値の代わりに引用符で囲まれた文字列を使用するためです。したがって、引用符はターミナルに表示されませんが、y は引用符に囲まれた文字列を直接ターミナルに出力します)。
##function 呼び出しの返り値が、呼び出しのコンテキストで意味と構文の両方が理解できることを確認するのは、アプリケーション・プログラマの責任です。
##function の入れ子
InterSystems IRIS では、##function 内の入れ子がサポートされます。##function では、##BeginLit...##EndLit、##function、##lit、##quote、##expression、##SafeExpression、##stripq、##unique、および ##this の各マクロ関数を入れ子にすることができます。