current_predicate 在 SICStus Prolog 中
current_predicate in SICStus Prolog
SICStus Prolog 同时提供 current_predicate/1 和 current_predicate/2。
manual page 状态:
current_predicate(?PredSpec)
Unifies PredSpec with a predicate specifications of the form Name/Arity.
current_predicate(?Name, ?Term)
Unifies Name with the name of a user-defined predicate, and Term with the most general term corresponding to that predicate.
它们似乎具有相同的特征:
两个谓词都适用于枚举谓词,都适用于模块。
手册页评论:
current_predicate/1 is part of the ISO Prolog standard; current_predicate/2 is not.
我应该在新的(= 非旧版)代码中使用 current_predicate/2
吗?
简答,没有。不要在新代码中使用它。
current_predicate/2
的好处是允许使用谓词调用 模板 查询是否定义了谓词,这与 current_predicate/1
不同。例如
...,
( current_predicate(_, foo(_, _)) ->
foo(A, B)
; ...
),
...
但您通常可以改用标准 predicate_property/2
谓词,它将模板作为第一个参数。
P.S。如果 Logtalk linter 发现你在调用 current_predicate/2
:-)
,它会向你尖叫(并建议一个更标准的替代方案)
SICStus Prolog 同时提供 current_predicate/1 和 current_predicate/2。
manual page 状态:
current_predicate(?PredSpec)
Unifies PredSpec with a predicate specifications of the form Name/Arity.
current_predicate(?Name, ?Term)
Unifies Name with the name of a user-defined predicate, and Term with the most general term corresponding to that predicate.
它们似乎具有相同的特征: 两个谓词都适用于枚举谓词,都适用于模块。
手册页评论:
current_predicate/1 is part of the ISO Prolog standard; current_predicate/2 is not.
我应该在新的(= 非旧版)代码中使用 current_predicate/2
吗?
简答,没有。不要在新代码中使用它。
current_predicate/2
的好处是允许使用谓词调用 模板 查询是否定义了谓词,这与 current_predicate/1
不同。例如
...,
( current_predicate(_, foo(_, _)) ->
foo(A, B)
; ...
),
...
但您通常可以改用标准 predicate_property/2
谓词,它将模板作为第一个参数。
P.S。如果 Logtalk linter 发现你在调用 current_predicate/2
:-)