8

先頭にユーザー名を付けずに、現在実行中の MLM 名を取得するにはどうすればよいですか? 特別なキーワードTHIS_MLM_NAMEは、MLM の名前を の形式で返しますがUSERNAME-302364198::MLM_NAME_HERE、MLM の名前だけが必要です。

私は使用してみましたSUBSTRING

SUBSTRING 200 CHARACTERS
STARTING AT ((FIND "::" IN THIS_MLM_NAME) + 2)
FROM THIS_MLM_NAME;

しかし、これは単に を返しますnull。私は何を間違っていますか?

4

1 に答える 1

4

問題は、それTHIS_MLM_NAMEが実際には Arden 文字列ではないことです。テストTHIS_MLM_NAME IS STRINGすると、偽になります。これを修正するには、次の文字列に変換しますTHIS_MLM_NAME AS STRING

ThisMLMName := SUBSTRING 200 CHARACTERS
   STARTING AT ((FIND "::" IN STRING (THIS_MLM_NAME AS String)) + 2)
   FROM (THIS_MLM_NAME AS String);

Sunrise Acute Care の Arden の実装にはデバッガーがないため、変数に関する情報を表示するのに役立つ次の MLM を作成しました (モジュールに名前を付けるMOD_VARIABLE_INFOか、実際の名前に一致するようにコードを変更します)。

// data slot
(Variable, Padding) := ARGUMENT;
Result := "";
IF NOT EXIST Padding THEN
   Padding := "";
ENDIF;
CR := (13 FORMATTED WITH "%c") || Padding;
Delimiter := "";
MOD_VARIABLE_INFO := MLM 'MOD_VARIABLE_INFO';
IF Variable IS LIST THEN
   Result := Result || "List(" || (COUNT Variable) || ") [" || CR || "   ";
   FOR Item IN Variable DO
      Result := Result || Delimiter;
      TempResult := CALL MOD_VARIABLE_INFO WITH Item, Padding || "   ";
      Result := Result || TempResult;
      Delimiter := "," || CR || "   ";
   ENDDO;
   Result := Result || CR || "]";
ELSEIF Variable IS STRING THEN
   Result := Result || "String";
ELSEIF Variable IS NUMBER THEN
   Result := Result || "Number";
ELSEIF Variable IS BOOLEAN THEN
   Result := Result || "Boolean";
ELSEIF Variable IS NET_OBJECT THEN
   Result := Result || ".Net Object";
ELSEIF Variable IS NULL THEN
   Result := Result || "Null";
ELSEIF Variable IS OBJECT THEN
   Result := Result || "Object {" || CR || "   ";
   FOR Attr IN (EXTRACT ATTRIBUTE NAMES Variable) DO
      Result := Result || Delimiter || Attr || ": ";
      Item := ATTRIBUTE Attr FROM Variable;
      TempResult := CALL MOD_VARIABLE_INFO WITH Item, Padding || "   ";
      Result := Result || TempResult;
      Delimiter := "," || CR || "   ";
   ENDDO;
   Result := Result || CR || "}";
ELSE
   Result := Result || "Unknown (" || Variable || ")";
ENDIF;
// logic slot
CONCLUDE True;
// action slot
RETURN Result;

この MLM は に対して「不明」を返しますがTHIS_MLM_NAME、少なくともネイティブの Arden データ型でも .Net データ型でもないことを示しています。

Sunrise MLM エディタでは、MLM の構文をチェックし、[Syntax Check MLM] タブをクリックして [Function Definition] を選択し、右下のペインのコードを見ることで、基礎となる Lisp で何が起こっているかを確認できます。を検索するTHIS_MLM_NAMEと、 が見つかります(SETQ THIS_MLM_NAME 'USERNAME-302364198::MLM_NAME)。このことから、変数が文字列ではなく、引用符付き/評価されていない単純な Lisp 式に設定されていることがわかります(SETQ THIS_MLM_NAME "USERNAME-302364198::MLM_NAME")

于 2013-04-03T17:20:44.570 に答える