3

在 Arden 中,当您将一个列表添加到另一个列表时,两个列表都会被展平。

例如:

MyList1 := "cat", "dog", "hamster";
DeepList := MyList1, ("hyena", "elephant", "puma");

现在,DeepList将不是列表列表,如下所示:

("cat", "dog", "hamster"), ("hyena", "elephant", "puma") // 2 lists, 3 items each

但它会像这样被展平:

"cat", "dog", "hamster", "hyena", "elephant", "puma" // single list of 6 items

有没有办法创建一个非扁平列表?创建这样的列表有时会非常有用。我已经搜索了手册,但找不到任何方法来做到这一点。在线搜索毫无结果——没有人发布有关传销的内容。

4

1 回答 1

3

在普通的“医学逻辑系统的雅顿语法”中,没有办法做到这一点。但是,在 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 与上述对象技巧产生的两级列表完全相同。

于 2013-04-03T17:54:22.453 回答