如何在Arden中创建非展平列表?

时间:2013-04-03 17:54:22

标签: arden-syntax

在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

有没有办法创建非展平列表?有时创建这样的列表非常有用。我搜索了手册,但找不到任何方法。在线搜索毫无结果 - 没有人提出有关传销的内容。

1 个答案:

答案 0 :(得分:3)

在普通的“医学逻辑系统的Arden语法”中,没有办法做到这一点。然而,在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时,将列表传递给第一个参数并将不同的列表传递给第二个参数是完全合法的。每当您尝试将单个列表作为参数传递时(因此解析器无法推断您将整个列表视为一个参数),您必须非常注意,以便解析器不会将其解释为简单参数列表 - 即使参数周围有额外的括号。

另请注意,如果您执行BREAK;并检查变量MultilevelList的值,则会显示cat, dog, hamster, hyena, elephant, puma。这是非常误导的,因为看起来像就像一个包含6个元素的列表一样,但它是不是,正如我们在上面用COUNT证明的那样。

在Arden Syntax的SCM变体中获取非展平列表的第二种方法是欺骗并使用直接Lisp代码。我们利用传递给MLM的参数是非展平的这一事实。创建一个MLM - 我会调用我的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与上面的对象技巧产生的两级列表完全相同。