create_mutable/2 在 SICStus Prolog 中
create_mutable/2 in SICStus Prolog
mutable terms 上的 SICStus Prolog 手册页指出:
[...] the effect of unifying two mutables is undefined.
那么,为什么create_mutable(data,x)
会失败呢?
难道不应该提出 uninstantiation_error
吗?
我想不出上述情况 不是 无意的编程错误(X
与 x
)...请帮忙!
对 "Why does create_mutable/2
not throw an exception when output unification fails?" 的简短回答只是:因为当该功能被添加到 SICStus Prolog 时就是这样做的,并且没有人提出改变它的有力理由。
一个重要的 "difference between the stream created by open/4
and the mutable term created by create_mutable/2
" 是 open/4
有副作用,如果对 open/4
的调用的输出统一失败,这些副作用是无法消除的。
从这个意义上说,create_mutable/2
有点像 is/2
如果输出参数是一些非数字的非变量项,它也会悄悄地失败,例如在 x is 3+4
。这似乎是在 Prolog 中处理输出参数的常见和传统方式。
我同意将非变量作为第二个参数很可能是编程错误。下一版本的 SICStus IDE、SPIDER 将对此发出警告(因为它已经对 is/2
发出警告)。
None 这个,也不是问题中的例子,似乎与引用的文档直接相关“[...] 统一两个可变变量的效果 [...]”。
mutable terms 上的 SICStus Prolog 手册页指出:
[...] the effect of unifying two mutables is undefined.
那么,为什么create_mutable(data,x)
会失败呢?
难道不应该提出 uninstantiation_error
吗?
我想不出上述情况 不是 无意的编程错误(X
与 x
)...请帮忙!
对 "Why does create_mutable/2
not throw an exception when output unification fails?" 的简短回答只是:因为当该功能被添加到 SICStus Prolog 时就是这样做的,并且没有人提出改变它的有力理由。
一个重要的 "difference between the stream created by open/4
and the mutable term created by create_mutable/2
" 是 open/4
有副作用,如果对 open/4
的调用的输出统一失败,这些副作用是无法消除的。
从这个意义上说,create_mutable/2
有点像 is/2
如果输出参数是一些非数字的非变量项,它也会悄悄地失败,例如在 x is 3+4
。这似乎是在 Prolog 中处理输出参数的常见和传统方式。
我同意将非变量作为第二个参数很可能是编程错误。下一版本的 SICStus IDE、SPIDER 将对此发出警告(因为它已经对 is/2
发出警告)。
None 这个,也不是问题中的例子,似乎与引用的文档直接相关“[...] 统一两个可变变量的效果 [...]”。