是否可以将参数 args 作为 deffunction 的单个列表获取?
Is it possible to get the parameter args as a single list for a deffunction?
我想写一个类似于内置 neq
的函数 all-neq
除了它还强制两个元素不能相同(而不是只有第一个不同)比其他人)。
因此,虽然 (neq 3 4 5 5)
的输出为 TRUE,但我希望 (all-neq 3 4 5 5)
为 FALSE,因为有两个 5。
这是我尝试过的方法,但我一直收到关于参数列表作为输入的错误。
(deffunction all-neq ?args
(foreach ?arg1 ?args
(foreach ?arg2 ?args
(if (and (not (eq ?arg1-index ?arg2-index))
(eq ?arg1 ?arg2)) then
(return FALSE))))
(return TRUE))
这个错误信息是:
[PRNTUTIL2] Syntax Error: Check appropriate syntax for parameter list.
您可以使用通配符参数将 deffunction 的所有剩余参数分组为单个多字段值:
CLIPS (6.31 6/12/19)
CLIPS>
(deffunction all-neq ($?args)
(foreach ?arg1 ?args
(foreach ?arg2 ?args
(if (and (not (eq ?arg1-index ?arg2-index))
(eq ?arg1 ?arg2)) then
(return FALSE))))
(return TRUE))
CLIPS> (all-neq 3 4 5 5)
FALSE
CLIPS> (all-neq 3 4 5 6)
TRUE
CLIPS>
这也会将所有多字段值合并为一个多字段值,因此在比较多字段值时您将无法获得正确的行为:
CLIPS> (all-neq (create$ 3 4) (create$ 5 5))
FALSE
CLIPS>
为了获得多字段值的正确行为,您需要按照高级编程指南中的描述在 C 中创建一个用户定义的函数,而不是使用 deffunction。
我想写一个类似于内置 neq
的函数 all-neq
除了它还强制两个元素不能相同(而不是只有第一个不同)比其他人)。
因此,虽然 (neq 3 4 5 5)
的输出为 TRUE,但我希望 (all-neq 3 4 5 5)
为 FALSE,因为有两个 5。
这是我尝试过的方法,但我一直收到关于参数列表作为输入的错误。
(deffunction all-neq ?args
(foreach ?arg1 ?args
(foreach ?arg2 ?args
(if (and (not (eq ?arg1-index ?arg2-index))
(eq ?arg1 ?arg2)) then
(return FALSE))))
(return TRUE))
这个错误信息是:
[PRNTUTIL2] Syntax Error: Check appropriate syntax for parameter list.
您可以使用通配符参数将 deffunction 的所有剩余参数分组为单个多字段值:
CLIPS (6.31 6/12/19)
CLIPS>
(deffunction all-neq ($?args)
(foreach ?arg1 ?args
(foreach ?arg2 ?args
(if (and (not (eq ?arg1-index ?arg2-index))
(eq ?arg1 ?arg2)) then
(return FALSE))))
(return TRUE))
CLIPS> (all-neq 3 4 5 5)
FALSE
CLIPS> (all-neq 3 4 5 6)
TRUE
CLIPS>
这也会将所有多字段值合并为一个多字段值,因此在比较多字段值时您将无法获得正确的行为:
CLIPS> (all-neq (create$ 3 4) (create$ 5 5))
FALSE
CLIPS>
为了获得多字段值的正确行为,您需要按照高级编程指南中的描述在 C 中创建一个用户定义的函数,而不是使用 deffunction。