Rascal MPL 重载库函数

Rascal MPL overload library functions

提问人:Teun M. 提问时间:12/12/2022 最后编辑:Teun M. 更新时间:12/12/2022 访问量:28

问:

像这样很容易重载你自己的函数:

void testVal(loc l) {
    println("LOC <l>");
}

void testVal(value v) {
    println("VAL <v>");
}

这样将调用第一个方法。我希望对以下方面做同样的事情:testVal(|tmp:///|)IO::println

void println(loc l) {
    IO::println("my custom println function");
}

用于调试目的。 现在应该打印 .可以这样做吗?对我来说,这段代码仍然默认为实现。println(|tmp:///|)"my custom println function"IO

函数 重载 standard-library rascal

评论


答:

1赞 Jurgen Vinju 12/12/2022 #1

函数重载通过非确定性选择工作。因此,如果模式或重叠,则无法知道先选择哪一个。testValprintln

事实上,在您的示例中,与 so 重叠,两个备选方案之间的优先级是未定义的。loc lvalue v

要解决这个问题,其中一个替代方案必须获得更精确的模式(例如,更改为以将其与 区分开来,或者您可以将修饰符放在函数之前:value vnum vloc ldefault

default void testVal(value v) {
   println("VAL <v>");
}

如果你想覆盖一个没有修饰符的现有函数,恐怕你就不走运了。您无法更改 IO 模块以添加 .因此,要解决此问题,您可以将 IO::p rintln 函数包装在您自己的函数中:defaultdefault

default void pln(value... v) {
   println(v);
}

void pln(loc l) {
   println("LOC <l>");
}

评论

0赞 Teun M. 12/12/2022
谢谢!符号是什么?是某种开箱吗?value... v
1赞 Jurgen Vinju 12/12/2022
O 这是像 C 和 Java 中的“varargs”一样,这意味着但在调用函数时不必放置方括号:list[value] vpln(1, 2, 3)