在普通的“医学逻辑系统的雅顿语法”中,没有办法做到这一点。但是,在 Sunrise Acute Care 的实施中,有两种方法可以在 Arden 中获得多层次、非扁平化的列表。
第一种方法是访问对象列表的属性。这种非扁平化的性质是由于 Sunrise 添加到普通 Arden 的对象处理扩展。首先,创建一个将属性设置为列表的对象列表。
AnimalObj := OBJECT [AnimalList]; // create a single-property object type
Animal := NEW AnimalObj WITH ,("cat", "dog", "hamster"); // see notes below
Animals := , Animal;
Animal := NEW AnimalObj;
Animal.AnimalList := "hyena", "elephant", "puma"; // an alternate way
Animals := Animals, Animal;
MultilevelList := Animals.AnimalList; // this is the magic. No object any more!
ListCount := COUNT MultilevelList; // 2
Item1Count := COUNT MultilevelList[1]; // 3
Item2Count := COUNT MultiLevelList[2]; // 3
关于注意事项NEW AnimalObj WITH
: 需要额外的逗号表示这不是映射参数的正常语法,其中“cat”是第一个属性,“dog”是第二个,依此类推。相反,我们必须添加逗号以强制它成为列表列表,消除关于如何解释列表的歧义,表明括号中的整个第一个值将分配给第一个属性。这顺便说明了列表确实存在于 Arden 中,在解析和处理过程中是非扁平的,如果你考虑一下这实际上是一个必需的功能,因为在调用 MLM 时,将列表传递给第一个参数和不同的列表是完全合法的到第二个。任何时候您尝试将单个列表作为参数传递(这样解析器就无法推断出您打算将整个列表作为一个参数),
另请注意,如果您执行 aBREAK;
并检查变量的值MultilevelList
,它将显示cat, dog, hamster, hyena, elephant, puma
。这是高度误导的,因为它看起来像一个包含 6 个元素的列表,但它不是,正如我们在上面用 证明的那样COUNT
。
在 Arden Syntax 的 SCM 变体中获得非扁平列表的第二种方法是作弊并使用直接 Lisp 代码。我们利用了传递给 MLM 的参数是非扁平化的这一事实。创建一个 MLM——我将调用 mine RETURN_ARGS
,并将此代码放入指定的插槽中:
data:
CallerArguments := NULL;
{(SETQ CallerArguments ARDEN_ARGUMENT)}; // direct Lisp code
logic:
CONCLUDE True;
action:
RETURN CallerArguments;
然后可以从另一个 MLM 非常简单地使用它:
MyList1 := "cat", "dog", "hamster";
RETURN_ARGS := MLM 'RETURN_ARGS';
DeepList := CALL RETURN_ARGS WITH MyList1, ("hyena", "elephant", "puma");
仔细检查将证明 DeepList 与上述对象技巧产生的两级列表完全相同。